Hogyan lehet megölni egy Java szálat

1. Bemutatkozás

Ebben a rövid cikkben kitérünk a megállásra a cérna Java-ban - ami nem olyan egyszerű, mivel a Thread.stop () módszer elavult.

Az Oracle ezen frissítésében leírtak szerint álljon meg() a megfigyelt objektumok megrongálódásához vezethet.

2. Zászló használata

Kezdjük egy osztállyal létrehozó és elindító osztállyal. Ez a feladat nem ér véget önmagában, ezért valamilyen módon meg kell állítanunk a szálat.

Ehhez atomzászlót használunk:

nyilvános osztály ControlSubThread megvalósítja Runnable {private Thread worker; privát döntő AtomicBoolean futás = új AtomicBoolean (hamis); privát int intervallum; public ControlSubThread (int sleepInterval) {intervall = sleepInterval; } public void start () {dolgozó = új szál (ez); munkás.indítás (); } public void stop () {running.set (false); } public void run () {running.set (true); while (running.get ()) {próbáld meg {Thread.sleep (intervallum); } catch (InterruptedException e) {Szál.currentThread (). megszakítás (); System.out.println ("A szál megszakadt, a műveletet nem sikerült befejezni"); } // tegyen itt valamit}}}

Ahelyett, hogy a míg hurok konstans kiértékelése igaz, egy AtomicBoolean és most elindíthatjuk / leállíthatjuk a végrehajtást úgy, hogy beállítjuk igaz hamis.

Amint azt az atomváltozók bevezetőjében kifejtettük, egy AtomicBoolean megakadályozza az ütközéseket a változó beállításában és ellenőrzésében a különböző szálakból.

3. Megszakítás a cérna

Mi történik amikor alvás() hosszú időközönként van beállítva, vagy ha várunk egy zár amit talán soha nem engednek ki?

Szembesülünk azzal a kockázattal, hogy hosszú ideig blokkolunk, vagy soha nem szüntetünk meg tisztán.

Hozhatjuk létre a megszakítás () ezekhez a helyzetekhez adjunk hozzá néhány módszert és egy új jelzőt az osztályhoz:

nyilvános osztály ControlSubThread megvalósítja Runnable {private Thread worker; privát AtomicBoolean futás = új AtomicBoolean (hamis); privát int intervallum; // ... public void megszakítás () {running.set (false); munkás.megszakítás (); } logikai isRunning () {return running.get (); } boolean isStopped () {return megállt.get (); } public void run () {running.set (true); stop.set (hamis); while (running.get ()) {próbáld meg {Thread.sleep (intervallum); } catch (InterruptedException e) {Szál.currentThread (). megszakítás (); System.out.println ("A szál megszakadt, a műveletet nem sikerült befejezni"); } // csinál valamit} stop.set (true); }} 

Hozzáadtunk egy megszakítás () módszer, amely meghatározza a mi futás flag to false, és meghívja a dolgozó szálait megszakítás () módszer.

Ha a szál alszik, amikor ezt hívják, alvás() kilép egy InterruptedException, akárcsak bármely más blokkoló hívás.

Ez visszaadja a szálat a hurokba, és azóta kilép futás hamis.

4. Következtetés

Ebben a gyors bemutatóban megvizsgáltuk az atomi változó használatát, opcionálisan a (z) hívással kombinálva megszakítás (), tisztán elzárni egy szálat. Ez mindenképpen előnyösebb, mint az elavultak hívása álljon meg() módszert, és kockáztatja az örökös zárolást és a memória sérülését.

Mint mindig, a teljes forráskód elérhető a GitHubon.