– Szia Amigo!

– Szia Rishi!

"Bemutatom az Object osztály várakozás , értesítés és notifyAll metódusait."

– Ma még csak megismerkedünk velük, de később visszatérünk, és több időt fordítunk erre.

"Oké."

"Ezeket a módszereket a szálszinkronizálási mechanizmus részeként találták ki."

"Hadd emlékeztesselek arra, hogy a Java beépített mechanizmussal vezérli a különböző szálakból származó megosztott erőforrásokhoz (objektumokhoz) való hozzáférést. Egy szál kijelentheti, hogy egy objektum foglalt, a többi szálnak pedig várnia kell, amíg a foglalt objektum felszabadul. "

"Emlékszem. Ezt a szinkronizált kulcsszóval csinálod ."

"Helyes. A kód általában így néz ki:"

public void print()
{
 Object monitor = getMonitor();
 synchronized(monitor)
 {
  System.out.println("text");
 }
}

– Emlékszel, hogyan működik?

"Igen. Ha két szál egyszerre hívja a print() metódust, az egyikük belép a szinkronizált blokkba, és lezárja a monitort, ami azt eredményezi, hogy a második szál megvárja, amíg a monitor felszabadul."

"Helyes. Amint egy szál belép a szinkronizált blokkba, a monitor objektum foglaltként lesz megjelölve, és a többi szál kénytelen lesz megvárni, amíg a monitorobjektum felszabadul. Ugyanaz a monitorobjektum használható a program különböző részein. "

– Egyébként miért a monitor nevet választottad?

"A monitor az, amit általában olyan objektumnak hívnak, amely az elfoglalt vagy szabad állapotot tárolja."

"És itt lépnek életbe a várakozás és értesítés módszerei."

"Valójában ez az egyetlen két módszer. A többi csak ezeknek a módszereknek az adaptációja."

"Most tekerjük a fejünket, hogy mi a várakozási módszer, és miért van rá szükségünk. "

"Néha előfordulnak olyan helyzetek egy programban, amikor egy szál beír egy szinkronkód blokkot, és lezárja a monitort, de nem tudja folytatni, mert hiányzik néhány adat. Például egy fájl, amelyet fel kell dolgoznia, még nem fejeződött be, vagy valami hasonló."

"Csak megvárhatnánk a fájl letöltését. Csak egy hurok segítségével ellenőrizheti. Ha a fájl még nem töltötte le, akkor aludjon egy kicsit, és ellenőrizze újra, amíg le nem töltődik."

"Valami ilyesmi:"

while(!file.isDownloaded())
{
 Thread.sleep(1000);
}
processFile(file);

"De a mi esetünkben ez a fajta várakozás túl drága. Mivel a mi szálunk lezárta a monitort, más szálak is kénytelenek várakozni, bár lehet, hogy már rendelkeznek a szükséges adatokkal."

"A wait() metódust ennek a problémának a megoldására találták ki. Ezzel a módszerrel a szál felszabadítja a monitort, majd «felfüggeszti» a szálat.

"A monitor objektum várakozási metódusa csak akkor hívható meg, ha a monitor foglalt, azaz csak egy szinkronizált blokkon belül. Ilyenkor a szál átmenetileg leáll, és a monitor felszabadul, hogy más szálak is használhassák."

"Gyakran előfordul, hogy egy szál belép egy szinkronizált blokkba és hívásvárakozik, így felszabadítja a monitort."

"Akkor egy második szál belép és felfüggesztésre kerül, majd egy harmadik, és így tovább."

– És hogyan lehet egy szálat folytatni?

"Ehhez van egy második módszer: értesíts."

"A monitor objektum notify / notifyAll metódusait csak akkor hívhatja meg, ha a monitor foglalt, azaz csak egy szinkronizált blokkon belül. A notifyAll metódus felébreszti az összes szálat, amely ezen a monitor objektumon várakozik."

"A notify metódus "felold" egy véletlenszerű szálat, de a notifyAll metódus feloldja a monitor összes "lefagyott" szálát."

"Nagyon érdekes. Köszönöm, Rishi."

"A wait() metódusnak is vannak adaptációi:"

vár() metódus Magyarázat
void wait(long timeout)
A szál "lefagy", de automatikusan "felold" a metódusnak argumentumként átadott ezredmásodpercek megvárása után.
void wait(long timeout, int nanos)
A szál "lefagy", de automatikusan "kioldódik", miután megvárta a metódusnak argumentumként átadott nanoszekundumok számát.

"Ezt is hívjuk várakozásnak időtúllépéssel. A módszer úgy működik, mint egy normál várakozás, de ha a megadott idő letelt, és a szálat nem ébresztik fel, akkor felébreszti magát."