Kako ubiti Java nit

1. Uvod

U ovom kratkom članku, pokrivat ćemo zaustavljanje a Nit u Javi - što nije tako jednostavno od Thread.stop () metoda je zastarjela.

Kao što je objašnjeno u ovom Oracleovom ažuriranju, Stop() može dovesti do oštećenja nadziranih objekata.

2. Korištenje zastave

Počnimo s klasom koja kreira i pokreće nit. Ovaj zadatak neće završiti sam od sebe, tako da trebamo zaustaviti tu nit.

Za to ćemo upotrijebiti atomsku zastavu:

javna klasa ControlSubThread implementira Runnable {private Thread worker; privatno konačno AtomicBoolean trčanje = novo AtomicBoolean (netačno); privatni int interval; javni ControlSubThread (int sleepInterval) {interval = sleepInterval; } javni void start () {worker = nova nit (ovo); worker.start (); } javna void stop () {running.set (false); } javna void run () {running.set (true); while (running.get ()) {try {Thread.sleep (interval); } catch (InterruptedException e) {Thread.currentThread (). interrupt (); System.out.println ("Nit je prekinut, operacija nije uspjela dovršiti"); } // // učini nešto ovdje}}}

Umjesto da imate dok petlja koja procjenjuje konstantu pravi, koristimo AtomicBoolean i sada možemo započeti / zaustaviti izvršenje postavljanjem na točno netočno.

Kao što je objašnjeno u našem uvodu u atomske varijable, koristeći AtomicBoolean sprječava sukobe u postavljanju i provjeri varijable iz različitih niti.

3. Prekidanje a Nit

Što se događa kad spavati() je postavljeno na dugi interval ili ako čekamo zaključati koji možda nikad neće biti objavljen?

Suočeni smo s rizikom da ćemo blokirati na duže vrijeme ili nikada nećemo završiti čisto.

Možemo stvoriti prekinuti() za ove situacije, dodajte nekoliko metoda i novu zastavu klasi:

javna klasa ControlSubThread implementira Runnable {private Thread worker; privatno AtomicBoolean trčanje = novo AtomicBoolean (netočno); privatni int interval; // ... javna praznina interrupt () {running.set (false); worker.interrupt (); } boolean isRunning () {return running.get (); } boolean isStopped () {povratak zaustavljen.get (); } javna void run () {running.set (true); zaustavljeno.set (lažno); while (running.get ()) {try {Thread.sleep (interval); } catch (InterruptedException e) {Thread.currentThread (). interrupt (); System.out.println ("Nit je prekinut, operacija nije uspjela dovršiti"); } // // učiniti nešto} stop.set (true); }} 

Dodali smo znak prekinuti() metoda koja postavlja naš trčanje flag na false i poziva radničku nit prekinuti() metoda.

Ako nit spava kad se to pozove, spavati() izaći će s InterruptedException, kao i svaki drugi blokirajući poziv.

To vraća nit u petlju i od tada će izaći trčanje je lažno.

4. Zaključak

U ovom smo brzom vodiču pogledali kako koristiti atomsku varijablu, po želji kombiniranu s pozivom na prekinuti(), za čisto zatvaranje niti. Ovo je definitivno poželjnije od pozivanja zastarjelih Stop() metoda i riskiranje zauvijek zaključavanja i oštećenja memorije.

Kao i uvijek, puni izvorni kod dostupan je na GitHub-u.