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.