– 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 |
---|---|
|
A szál "lefagy", de automatikusan "felold" a metódusnak argumentumként átadott ezredmásodpercek megvárása után. |
|
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."
GO TO FULL VERSION