"Szia Amigo!

"Minden új csak valami régi, amit elfelejtettünk. Ma a szálak leállításáról fogok beszélni. Remélem, már elfelejtetted az interrupt() metódus működését."

– Igen, Ellie, teljesen elfelejtettem.

– Remek. Akkor emlékeztetlek.

"A Java-ban ha valaki le akar állítani egy futó szálat, ezt jelezheti a szálnak. Ehhez a Thread objektum rejtett isInterrupted változóját igazra kell állítani."

"Minden szálnak van egy interrupt() metódusa, ami ennek a jelzőnek a beállítására szolgál. Az interrupt () metódus meghívásakor a Thread objektumon belüli isInterrupted változó true értékre lesz állítva."

"És amikor a Thread.sleep() vagy a join() metódus meghívásra kerül egy szálon, a metódus ellenőrzi, hogy az isInterrupted jelző be van-e állítva az aktuális szálhoz. Ha ez a jelző be van állítva (az isInterrupted változó értéke true), akkor a metódusok dobj egy InterruptedExceptiont ."

"Itt emlékeztetlek egy régi példára:"

Kód Leírás
class Clock implements Runnable
{
public void run()
{
Thread current = Thread.currentThread();

while (!current.isInterrupted())
{
Thread.sleep(1000);
System.out.println("Tik");
}
}
}
Az Óra futtatási metódusa lekéri az aktuális szál Thread objektumát.

Az Óra osztály másodpercenként egyszer írja a "Tick" szót a konzolra mindaddig, amíg az aktuális szál isInterrupt változója hamis.

Amikor az isInterrupt igaz, a futtatási metódus leáll.

public static void main(String[] args)
{
Clock clock = new Clock();
Thread clockThread = new Thread(clock);
clockThread.start();

Thread.sleep(10000);
clockThread.interrupt();
}
A főszál egy gyermekszálat (órát) indít el, amelynek örökké futnia kell.

Várjon 10 másodpercet , és szakítsa meg a feladatot a megszakítási mód meghívásával.

A főszál befejezi munkáját.

Az óraszál befejezi a munkáját.

"Itt az alvás módszert egy végtelen ciklus részeként használjuk a futási metódusban. A ciklusban az isInterrupt változót automatikusan ellenőrzi. Ha egy szál meghívja a sleep metódust, a metódus először ellenőrzi, hogy az isInterrupt igaz-e az adott szálra (a amelyik az alvási módszert hívta meg). Ha ez igaz, akkor a módszer nem alszik el. Ehelyett egy InterruptedException- t dob ​​ki ."

"De ebben a példában folyamatosan ellenőrizzük az isInterrupted változót a hurok állapotában."

"Emlékszem, volt néhány oka annak, hogy nem tudtuk használni ezt a megközelítést. Emlékeztetnél?"

" Először is , a futtatási metódusnak nincs mindig hurokja. A metódus egyszerűen csak néhány tucat más metódushívásból áll. Ebben az esetben minden metódushívás előtt hozzá kell adnia egy isInterrupted ellenőrzést."

" Másodszor , néhány módszer, amely sok különböző műveletet tartalmaz, nagyon hosszú ideig tarthat."

" Harmadszor , a kivétel dobása nem helyettesíti az isInterrupted ellenőrzést. Ez csak egy kényelmes kiegészítés. A kidobott kivétel segítségével gyorsan visszatekerheti magához a futtatási metódushoz a hívási veremet."

" Negyedszer , az alvásmódszert gyakran használják. Kiderült, hogy ezt a hasznos módszert egy implicit ellenőrzés is fokozza, amely nem kevésbé hasznos.  Mintha senki nem adta volna hozzá kifejezetten a csekket, de ez van.  Ez rendkívül értékes, ha valaki más kódját használja, és nem tudja saját maga hozzáadni a csekket."

" Ötödször , a kiegészítő ellenőrzés nem rontja a teljesítményt. Az alvásmódszer meghívása azt jelenti, hogy a szálnak nem kellene semmit tennie (kivéve az alvást), így a többletmunka senkit sem zavar."

– Pontosan ezt mondtad korábban.

"És mi a helyzet a kijelentésével: " Senki sem tudja garantálni, hogy egy szálat leállítanak. Csak egy szál állíthatja meg magát. " Meg tudod ezt magyarázni?

"Biztos."

"Korábban a Java korai verzióiban a szálakban volt egy stop() metódus. És amikor meghívtad, a JVM valójában leállította a szálat. De ha egy szál a JVM-en kívül csinált valamit (például írt egy fájlba vagy hívott Az operációs rendszer funkciói), amikor így megszakadt, a megszakítás sok problémát okozott, például lezáratlan fájlok, kiadatlan rendszererőforrások stb.

"A Java alkotóinak közgyűlése úgy döntött, hogy eltávolítják a szálak erőszakos leállításának módszerét. Most már csak annyit tehetünk, hogy beállítunk egy bizonyos jelzőt (isInterrupted), és reméljük, hogy a szál kódja helyesen lett megírva, így ez a jelző feldolgozásra kerül. olyan, mint egy tábla, amely azt mondja: „Férj, állj meg, kérlek. Nagyon fontos!” De hogy megáll-e vagy sem, az a saját dolga."

– De mi a helyzet a Megszakított kivétellel?

"Mi van akkor, ha az ezen a szálon futó kódban van egy csomó try-catch blokk? Még akkor sem, ha valahol InterruptedException történik, semmi garancia nincs arra, hogy néhány try-catch nem fogja el, és nem felejti el. Tehát nincs garancia arra, hogy a szál leáll."

"A másik dolog, hogy a szálak már elég alacsony szintű programozásnak számítanak. De erről majd legközelebb."

– Te nem Ellie vagy, hanem Scheherazade!

"Szóval, Amigo! Minden világos az aktuális leckében?"

"Igen."

"Oké jó."