<div dir="ltr">Sziasztok,<br><br>Csináltam egy egyszerű wait notify feladatot. Még félév elején mutattam a hallgatóimnak egy wc-s példát, itt egyedül a szálindítás és a synchronized kellett. Röviden ennyi volt a kód: 2 ember (szál) egyszerre akarja ugyanazt a wc-t használni. Szinkronizálás nélkül egymásra nyitják az ajtót, ez nem jó. Szinkronizált Toilet.use() metódussal viszont már megvárják egymást.<div><br></div><div>Ezt most kiegészítettem annyival hogy kell wc papír is a wc használathoz, viszont alapból az nincs a helyiségben és várni kell a karbantartóra aki feltölti papírral a tartályt (nem a víztartályt ;) ). Félév eleji tudással ez úgy működne, hogy mivel egyszerre 1 ember lehet csak a helyiségben, ezért a Toilet.refill() is szinkronizált, ekkor viszont aki a Toilet.use() alatt blokkolódik wc papír hiány miatt az sohasem tudná befejezni a feladatát, mert magára zárta az ajtót és benn várja a csodát (pontosabban a wc papírt).</div><div><br></div><div>Egyszerű de rossz megoldás (ToiletSolvedBad) ha a Toilet.use() nem blokkolódik hanem wait-t hív ha nincs elég papír, a Toilet.refill() pedig notify-t hív a végén. Ez rossz mert a wait miatt másik ember is bemehet, nem csak a karbantartó, hiszen a wait kinyitja a wc ajtót. Ehelyett be kell rakni egy új objektumot a wc-be, pl egy telefont amivel lehet a wc papír problémákat külön kezelni az ajtózárástól. Ezt az új objektumot szerezze meg a benn lévő, hívjon rá egy wait-t, csak ekkor (vagy ha épp senki nem akarja használni a wc-t) mehessen be a karbantartó a wc papírral. Ő majd erre az objektumra nyomja a notify-t, ezért pont az az ember aki a wait-t hívta fog visszamenni és befejezni a feladatát (hiszen magát a wc kulcsot soha nem kellett vissza adnia a wc papír mizéria során).</div><div><br></div><div>Ezzel megtanulják a hallgatók hogy nem meggondolatlanul kell nyomogatni a wait-notify-t hanem megfelelő objektumra kell zárni és megfelelő objektumra kell a wait-notify is hívni különben hibás program születhet. Magyarul végig kell gondolni hogy ideiglenesen amíg várunk milyen kulcsot akarunk visszaadni és mit szeretnénk továbbra is birtokolni (nem pedig braindead módon egyik helyre wait, másik helyre notify aztán lesz ami lesz).</div><div><br></div><div>Feladat szöveget nem írtam, de az kb annyi hogy megkapják a Toilet.java-t és az a feladat hogy javítsd ki a busy waitinget wait-notify-ra.</div><div><br>Üdv,</div><div>Andor </div></div>