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