Sådan dræbes en Java-tråd

1. Introduktion

I denne korte artikel, vi dækker stop af en Tråd i Java - hvilket ikke er så simpelt siden Thread.stop () metoden er udfaset.

Som forklaret i denne opdatering fra Oracle, hold op() kan føre til, at overvågede objekter bliver ødelagt.

2. Brug af et flag

Lad os starte med en klasse, der opretter og starter en tråd. Denne opgave slutter ikke alene, så vi har brug for en måde at stoppe den tråd på.

Vi bruger et atomflag til det:

offentlig klasse ControlSubThread implementerer Runnable {privat trådarbejder; privat endelig AtomicBoolean kører = ny AtomicBoolean (falsk); privat int-interval public ControlSubThread (int sleepInterval) {interval = sleepInterval; } offentlig ugyldig start () {arbejdstager = ny tråd (dette); worker.start (); } offentligt ugyldigt stop () {running.set (false); } public void run () {running.set (true); while (running.get ()) {prøv {Thread.sleep (interval); } fange (InterruptedException e) {Thread.currentThread (). interrupt (); System.out.println ("Tråden blev afbrudt, kunne ikke fuldføre operationen"); } // gør noget her}}}

I stedet for at have en mens loop evaluere en konstant rigtigt, vi bruger en AtomicBoolean og nu kan vi starte / stoppe udførelsen ved at indstille den til sandt falsk.

Som forklaret i vores introduktion til Atomic Variables ved hjælp af en AtomicBoolean forhindrer konflikter i indstilling og kontrol af variablen fra forskellige tråde.

3. Afbrydelse af a Tråd

Hvad sker der når søvn() er indstillet til et langt interval, eller hvis vi venter på en låse der måske aldrig frigives?

Vi står over for risikoen for at blokere i lang tid eller aldrig afslutte rent.

Vi kan oprette afbryde() i disse situationer, lad os tilføje et par metoder og et nyt flag til klassen:

offentlig klasse ControlSubThread implementerer Runnable {privat trådarbejder; private AtomicBoolean kører = nye AtomicBoolean (falsk); privat int-interval // ... public void interrupt () {running.set (false); worker.interrupt (); } boolsk isRunning () {return running.get (); } boolsk isStoppet () {retur stoppet.get (); } public void run () {running.set (true); stoppet. sæt (falsk); while (running.get ()) {prøv {Thread.sleep (interval); } fange (InterruptedException e) {Thread.currentThread (). interrupt (); System.out.println ("Tråden blev afbrudt, kunne ikke fuldføre operationen"); } // gør noget} stoppet. sæt (sandt); }} 

Vi har tilføjet en afbryde() metode, der sætter vores kører marker til falsk og kalder arbejderens tråd afbryde() metode.

Hvis tråden sover, når dette kaldes, søvn() vil afslutte med en Afbrudt undtagelse, ligesom ethvert andet blokerende opkald.

Dette returnerer tråden til sløjfen, og den afslutter siden kører er falsk.

4. Konklusion

I denne hurtige vejledning så vi på, hvordan man bruger en atomvariabel, valgfrit kombineret med et kald til afbryde(), at lukke en tråd rent ned. Dette foretrækkes bestemt frem for at kalde forældede hold op() metode og risikerer at låse for evigt og hukommelseskorruption.

Som altid er den fulde kildekode tilgængelig på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found