"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 |
---|---|
|
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. |
|
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.
GO TO FULL VERSION