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.