"Hallo Amigo!
"Al het nieuwe is gewoon iets ouds dat we zijn vergeten. Vandaag zal ik het hebben over het stoppen van threads. Ik hoop dat je al bent vergeten hoe de methode interrupt() werkt."
"Ja, Ellie, ik ben het helemaal vergeten."
"Geweldig. Dan zal ik je eraan herinneren."
"Als iemand in Java een lopende thread wil stoppen, kan hij dit aan de thread doorgeven. Om dit te doen, moet je de variabele hidden isInterrupted van het Thread-object instellen op true."
"Elke Thread heeft een methode interrupt() die wordt gebruikt om deze vlag in te stellen. Wanneer de methode interrupt () wordt aangeroepen, wordt de variabele isInterrupted in het object Thread ingesteld op true."
"En wanneer de methode Thread.sleep() of join() wordt aangeroepen op een thread, controleert de methode of de vlag isInterrupted is ingesteld voor de huidige thread. Als deze vlag is ingesteld (de variabele isInterrupted is gelijk aan true) , dan gooi een InterruptedException ."
"Hier, ik zal je herinneren aan een oud voorbeeld:"
Code | Beschrijving |
---|---|
|
De run-methode van de Clock haalt het Thread-object op voor de huidige thread.
De klasse Clock schrijft het woord "Tick" eenmaal per seconde naar de console zolang de variabele isInterrupt van de huidige thread onwaar is. Wanneer isInterrupt waar wordt, wordt de methode run beëindigd. |
|
De hoofdthread start een kinderthread (klok) die voor altijd zou moeten lopen.
Wacht 10 seconden en annuleer de taak door de interruptmethode aan te roepen. De rode draad maakt zijn werk af. De klokdraad maakt zijn werk af. |
"Hier gebruiken we de slaapmethode als onderdeel van een oneindige lus in de run- methode. In de lus wordt de variabele isInterrupt automatisch gecontroleerd. Als een thread de slaapmethode aanroept , controleert de methode eerst of isInterrupt waar is voor die thread (de een die de slaapmethode heeft genoemd). Als het waar is, slaapt de methode niet. In plaats daarvan genereert het een InterruptedException ."
"Maar in dit voorbeeld controleren we constant de variabele isInterrupted in de conditie van de lus."
'Ik herinner me dat er enkele redenen waren waarom we deze aanpak niet konden gebruiken. Kun je me eraan herinneren?'
" Ten eerste heeft de methode run niet altijd een lus. De methode kan gewoon bestaan uit enkele tientallen aanroepen naar andere methoden. In dit geval zou je een isInterrupted-controle moeten toevoegen voor elke methodeaanroep."
" Ten tweede kan het heel lang duren voordat een methode met veel verschillende acties wordt uitgevoerd."
" Ten derde , het gooien van een uitzondering is geen vervanging van de isInterrupted-controle. Het is gewoon een handige toevoeging. Met de gegenereerde uitzondering kun je de call-stack snel terugdraaien naar de run- methode zelf."
" Ten vierde wordt de slaapmethode veel gebruikt. Het blijkt dat deze behulpzame methode wordt versterkt door een impliciete controle die niet minder nuttig is. Het is alsof niemand de controle specifiek heeft toegevoegd, maar daar is het. Dit is super waardevol als je je gebruikt de code van iemand anders en je kunt de cheque niet zelf toevoegen."
" Ten vijfde , de extra controle verslechtert de prestaties niet. Het aanroepen van de slaapmethode betekent dat de thread niets zou moeten doen (behalve slapen), dus het extra werk stoort niemand."
"Dat is precies wat je eerder zei."
"En hoe zit het met uw stelling: « Niemand kan garanderen dat een thread wordt gestopt. Alleen een thread kan zichzelf stoppen. » Kunt u dat uitleggen?"
"Zeker."
"Voorheen, in vroege versies van Java, hadden threads een stop() methode. En als je die aanriep, stopte de JVM de thread eigenlijk. Maar als een thread iets deed buiten de JVM (bijvoorbeeld schrijven naar een bestand of aanroepen OS-functies) toen het op deze manier werd onderbroken, veroorzaakte de onderbreking veel problemen, zoals niet-gesloten bestanden, niet-vrijgegeven systeembronnen, enz."
"Een algemene vergadering van de makers van Java heeft besloten om de methode voor het geforceerd stoppen van threads te verwijderen. Nu kunnen we alleen nog een bepaalde vlag instellen (isInterrupted) en hopen dat de threadcode correct is geschreven, zodat deze vlag wordt verwerkt. Deze vlag is als een bord dat zegt: 'Thread, stop, please. Het is heel belangrijk!'. Maar of het stopt of niet, is zijn eigen zaak."
"Maar hoe zit het met de InterruptedException?"
"Wat als de code die op deze thread wordt uitgevoerd een aantal try-catch-blokken heeft? Zelfs als er ergens een InterruptedException optreedt, is er absoluut geen garantie dat een of andere try-catch het niet zal vangen en vergeten. Er zijn dus geen garanties dat de draad zal stoppen."
"Een ander ding is dat threads al als vrij low-level programmeren worden beschouwd. Maar daar zal ik je de volgende keer over vertellen."
'Jij bent Ellie niet, jij bent Scheherazade!'
"Dus, Amigo! Is alles in de huidige les duidelijk?"
"Ja."
"OK goed."
GO TO FULL VERSION