Hvordan drepe en Java-tråd

1. Introduksjon

I denne korte artikkelen, vi dekker å stoppe en Tråd i Java - som ikke er så enkelt siden Thread.stop () metoden avvikles.

Som forklart i denne oppdateringen fra Oracle, Stoppe() kan føre til at overvåkede objekter blir ødelagt.

2. Bruke et flagg

La oss starte med en klasse som oppretter og starter en tråd. Denne oppgaven slutter ikke alene, så vi trenger en måte å stoppe den tråden på.

Vi bruker et atomflagg til det:

offentlig klasse ControlSubThread implementerer Runnable {privat trådarbeider; privat finale AtomicBoolean running = new AtomicBoolean (false); privat int-intervall; public ControlSubThread (int sleepInterval) {intervall = sleepInterval; } offentlig ugyldig start () {arbeider = ny tråd (dette); worker.start (); } offentlig ugyldig stopp () {running.set (false); } public void run () {running.set (true); while (running.get ()) {prøv {Thread.sleep (intervall); } fange (InterruptedException e) {Thread.currentThread (). interrupt (); System.out.println ("Tråden ble avbrutt, kunne ikke fullføre operasjonen"); } // gjør noe her}}}

Snarere enn å ha en samtidig som loop evaluere en konstant ekte, bruker vi en AtomicBoolean og nå kan vi starte / stoppe kjøringen ved å sette den til sant / usant.

Som forklart i vår introduksjon til Atomic Variables, ved hjelp av en AtomicBoolean forhindrer konflikter i innstilling og kontroll av variabelen fra forskjellige tråder.

3. Avbryte a Tråd

Hva skjer når søvn() er satt til et langt intervall, eller hvis vi venter på en låse som kanskje aldri blir løslatt?

Vi står overfor risikoen for å blokkere i lang tid eller aldri avslutte rent.

Vi kan lage avbryte() for disse situasjonene, la oss legge til noen få metoder og et nytt flagg i klassen:

offentlig klasse ControlSubThread implementerer Runnable {privat trådarbeider; private AtomicBoolean kjører = nye AtomicBoolean (falske); privat int-intervall; // ... public void interrupt () {running.set (false); arbeider.interrupt (); } boolsk isRunning () {return running.get (); } boolsk isStoppet () {retur stoppet.get (); } public void run () {running.set (true); stoppet. sett (falsk); while (running.get ()) {prøv {Thread.sleep (intervall); } fange (InterruptedException e) {Thread.currentThread (). interrupt (); System.out.println ("Tråden ble avbrutt, kunne ikke fullføre operasjonen"); } // gjør noe} stoppet. sett (sant); }} 

Vi har lagt til en avbryte() metode som setter vår løping flagg til falsk og kaller arbeiderens tråd avbryte() metode.

Hvis tråden sover når dette kalles, søvn() vil gå ut med en Avbrutt unntak, som alle andre blokkeringsanrop.

Dette returnerer tråden til løkken, og den vil avsluttes siden løping er falsk.

4. Konklusjon

I denne raske opplæringen så vi på hvordan man bruker en atomvariabel, eventuelt kombinert med et kall til avbryte(), for å slå av en tråd. Dette er definitivt å foretrekke fremfor å ringe de utfasede Stoppe() metode og risikere å låse for alltid og minnekorrupsjon.

Som alltid er hele kildekoden tilgjengelig på GitHub.