Ako zabiť vlákno Java

1. Úvod

V tomto krátkom článku zakryjeme zastavenie a Závit v Jave - čo nie je také jednoduché, pretože Thread.stop () metóda je zastaraná.

Ako je vysvetlené v tejto aktualizácii od spoločnosti Oracle, stop () môže viesť k poškodeniu monitorovaných objektov.

2. Používanie vlajky

Začnime triedou, ktorá vytvára a začína vlákno. Táto úloha sa sama neskončí, takže potrebujeme nejaký spôsob zastavenia tohto vlákna.

Použijeme na to atómový príznak:

verejná trieda ControlSubThread implementuje Runnable {private Thread worker; súkromné ​​záverečné AtomicBoolean beží = nový AtomicBoolean (false); interval súkromných int; public ControlSubThread (int sleepInterval) {interval = sleepInterval; } public void start () {worker = new Thread (this); worker.start (); } public void stop () {running.set (false); } public void run () {running.set (true); while (running.get ()) {try {Thread.sleep (interval); } catch (InterruptedException e) {Thread.currentThread (). interrupt (); System.out.println ("Vlákno bolo prerušené, operáciu sa nepodarilo dokončiť"); } // niečo tu urobte}}}

Skôr ako mať zatiaľ čo slučka hodnotiaca konštantu pravda, používame AtomicBoolean a teraz môžeme spustiť / zastaviť vykonávanie nastavením na pravda lož.

Ako je vysvetlené v našom úvode k atómovým premenným, použitie znaku AtomicBoolean zabraňuje konfliktom pri nastavovaní a kontrole premennej z rôznych vlákien.

3. Prerušenie a Závit

Čo sa stane, keď spánok () je nastavený na dlhý interval, alebo ak čakáme na zámok ktoré by sa nikdy nemohli vydať?

Čelíme riziku blokovania na dlhšiu dobu alebo toho, že nikdy nebudeme končiť čisto.

Môžeme vytvoriť prerušiť() pre tieto situácie pridajme do triedy niekoľko metód a nový príznak:

verejná trieda ControlSubThread implementuje Runnable {private Thread worker; spustený súkromný AtomicBoolean = nový AtomicBoolean (nepravdivý); interval súkromných int; // ... public void interrupt () {running.set (false); worker.interrupt (); } boolean isRunning () {return running.get (); } boolean isStopped () {návrat zastavený.get (); } public void run () {running.set (true); stop.set (false); while (running.get ()) {try {Thread.sleep (interval); } catch (InterruptedException e) {Thread.currentThread (). interrupt (); System.out.println ("Vlákno bolo prerušené, operáciu sa nepodarilo dokončiť"); } // niečo urobiť} zastavené.nastaviť (pravda); }} 

Pridali sme prerušiť() metóda, ktorá nastavuje naše bežiaci flag na false a zavolá pracovné vlákno prerušiť() metóda.

Ak vlákno spí, keď sa to volá, spánok () odíde s Prerušená výnimka, ako každý iný blokujúci hovor.

Toto vráti vlákno do slučky a od tej doby bude ukončené bežiaci je nepravdivé.

4. Záver

V tomto rýchlom návode sme sa pozreli na to, ako používať atómovú premennú, voliteľne kombinovanú s volaním na prerušiť(), čisto vypnúť vlákno. Toto je určite lepšie ako zavolať zastaralým stop () metóda a riziko navždy uzamknutia a poškodenia pamäte.

Celý zdrojový kód je ako vždy k dispozícii na serveri GitHub.


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