Forum » Programiranje » Kaj je narobe v tej kodi [Java]
Kaj je narobe v tej kodi [Java]
Bojevnik ::
Nekje v tej kodi bi morala biti napaka, toda jo ne najdem.
Po knjigi pišem programček ki naj bi sinhroniziral delovanje dveh niti.
Poleg te kode imam še dve niti natakar in gost. Natakar daje na mizo hrano gostu gost jo pa poje.
Problem je da stvar ne dela. Npr. se zgodi da natakar prinese naslednjo jed še preden je gost pojedel prejšno.
Tukaj sta še kodi za natakarja in gosta
public class Miza { private String jed ="(prazno)"; private boolean naVoljo = false; public synchronized void setJed(String jed) { while (naVoljo == true) { try { wait(); } catch(Exception e) { e.printStackTrace(); } } this.jed = jed; naVoljo = true; notify(); } public synchronized String getJed() { while (naVoljo == false) { try { wait(); } catch(Exception e) { e.printStackTrace(); } } naVoljo = false; notify(); return jed; } }
Po knjigi pišem programček ki naj bi sinhroniziral delovanje dveh niti.
Poleg te kode imam še dve niti natakar in gost. Natakar daje na mizo hrano gostu gost jo pa poje.
Problem je da stvar ne dela. Npr. se zgodi da natakar prinese naslednjo jed še preden je gost pojedel prejšno.
Tukaj sta še kodi za natakarja in gosta
public class Gost extends Thread { private Miza m; public Gost( Miza m ) { this.m = m; } public void run() { String jed =""; do { try { sleep((int) Math.random() * 100); } catch(Exception e) { e.printStackTrace(); } jed = m.getJed(); System.out.println("Pojedel: "+jed); } while(!jed.equals("sladica")); } }
public class Natakar extends Thread { private Miza m; public Natakar( Miza m ) { this.m = m; } @Override public void run() { String[] jedi = { "predjed", "juha", "glavna jed", "sladica" }; for( int x=0; x<jedi.length; x++) { m.setJed(jedi[x]); System.out.println("Postregel: " + jedi[x]); try { sleep((int) Math.random() * 100); } catch(Exception e) { e.printStackTrace(); } } } }
arjan_t ::
ti tu rabiš neki "exclusive" lock za mizo, ker synchronized ti bo samo naredilo da lahko samo Gost ali Natakar dostopata do set/get jed, ampak ko gost naredi getJed in spi lahko natakat prinaša na mizo neomejeno obrokov
edit: tvoj problem je v grobem producer-consumer (Producer-consumer problem) @ Wikipedia
edit: tvoj problem je v grobem producer-consumer (Producer-consumer problem) @ Wikipedia
Zgodovina sprememb…
- spremenil: arjan_t ()
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [java]problem z ThrowsOddelek: Programiranje | 1600 (1129) | killa bee |
» | [Android] ThreadOddelek: Programiranje | 1191 (968) | Spura |
» | [Android] Bluetooth aplikacijaOddelek: Programiranje | 1087 (950) | marjan_h |
» | [Android] Nov tip shranjevanja slikeOddelek: Programiranje | 2182 (1306) | urosz |
» | Java in pošiljanje elektronske pošte!!Oddelek: Programiranje | 1352 (1253) | janez_janez |