"Helló, Amigo! El kell ismerned, hogy Ellie Cancel ötlete zseniális volt."

"Igen."

"Igazából valami hasonló létezik a Thread osztályban. Csak a változó neve nem isCancel . IsInterrupt . És a szál leállítására használt metódus nem cancel() . Ez interrupt() ."

"Igazán?"

"Igen. Nézd meg:"

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("Tick");
}
}
}
Mivel több szál is meghívhatja a futtatási metódust ugyanazon az Óra objektumon, az aktuális szálhoz a Thread objektumot kapjuk .

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

Amikor az isInterrupt igaz lesz , 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 a munkáját.

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

Sőt, az alvásmódszer , amelyet az emberek annyira szeretnek végtelen ciklusokban használni a futási metódusban, automatikusan ellenőrzi az isInterrupt változót. Ha egy szál meghívja az alvásmódszert , a metódus először ellenőrzi, hogy az isInterrupt igaz-e az adott szálra. Ha ez igaz, a módszer nem alszik el. Ehelyett egy InterruptedException kivételt dob .

"Miért dobnánk ki egy kivételt? Nem lenne jobb, ha az isCancel() helyett egyszerűen az isInterrupted()-et tenné egy ciklusba?"

" 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. Ezután 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 foglal magában, nagyon hosszú ideig tarthat."

" Harmadszor , egy kivétel eldobá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. Mint kiderült, ezt a hasznos módszert egy implicit ellenőrzés is fokozza, amely nem kevésbé hasznos. Mintha senki sem adta volna hozzá 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."

– Ezek komoly érvek.

"És végül itt van a következő: A futtatási metódus meghívhatja valaki más kódját – olyan kódot, amelyhez Ön nem fér hozzá (forráskód és/vagy a kód módosításának joga). Lehetséges, hogy nem rendelkezik isInterrupted ellenőrzésekkel, és használhatja " próbálja meg ... elkapni (e kivétel) " az összes kivétel elkapásához.

Senki sem tudja garantálni, hogy egy szál leáll. Csak egy szál állíthatja meg magát.