"Helló, Amigo! Itt van egy érdekes kérdés, ami vagy már felmerült, vagy hamarosan meg fog tenni. Hogyan lehet megállítani egy futó szálat? "

Tegyük fel, hogy a felhasználó azt mondja a programnak, hogy «töltsön le egy fájlt az internetről». A fő szál külön gyermekszálat hoz létre ehhez a feladathoz, és átad neki egy objektumot, amelynek futtatási metódusa tartalmazza a fájl letöltéséhez szükséges összes műveletet.

De a felhasználó hirtelen meggondolja magát. Nem akarja letölteni a fájlt. Hogyan mondhatunk le egy munkát és állíthatjuk le a szálat?

– Igen, mondd el, hogyan?

" Nem tehetjük. Ez a leggyakoribb és leghelyesebb válasz. Egy szálat nem lehet leállítani. Csak az tudja megállítani magát. "

De küldhet egy jelet egy szálnak, valamilyen módon közli vele, hogy a munkát már nem kell elvégezni, és be kell fejezni. Ahogy a fő szál a fő metódusból való visszatéréssel ér véget, a gyermekszál a futtatási metódusból való visszatéréssel ér véget.

– Mi a legjobb módja ennek?

"Hozzáadhat néhány változót, például egy logikai értéket . Ha igaz , a szál lefut. Ha hamis  , a szálnak meg kell szakadnia. Például így:"

Kód Leírás
class Clock implements Runnable
{
public void run()
{
while (true)
{
Thread.sleep(1000);
System.out.println("Tick");

if (!ClockManager.isClockRun)
return;
}
}
}

Az Óra osztály másodpercenként egyszer „Tick”-et ír a konzolra örökké

Ha a ClockManager.isClockRun értéke hamis, a futtatási metódus véget ér.

class ClockManager
{
public static boolean isClockRun = true;
public static void main(String[] args)
{
Clock clock = new Clock();
Thread clockThread = new Thread(clock);
clockThread.start();

Thread.sleep(10000);
isClockRun = false;
}

}
A főszál egy gyermekszálat (órát) indít el, amelynek örökké futnia kell

Várjon 10 másodpercet, és adjon jelet az órának, hogy véget ér.

A főszál befejezi a munkáját.

Az óraszál befejezi munkáját.

– Mi van, ha több szálunk van, akkor mi van?

"A legjobb, ha minden szálhoz van egy ilyen változó. A legkényelmesebb, ha közvetlenül az osztályhoz adja hozzá. Ott felvehet egy logikai isRun változót. Azonban jobb, ha hozzáad egy logikai isCancel változót, amely igaz lesz , ha a feladat törölve."

Kód Leírás
class Clock implements Runnable
{
private boolean isCancel = false;

public void cancel()
{
this.isCancel = true;
}

public void run()
{
while (!isCancel)
{
Thread.sleep(1000);
System.out.println("Tick");
}
}
}
Az Óra osztály másodpercenként egyszer írja a „Tick” szót a konzolra, amíg az isCancel hamis.

Amikor az isCancel igazsá válik, a futtatási metódus leáll.

public static void main(String[] args)
{
Clock clock = new Clock();
Thread clockThread = new Thread(clock);
clockThread.start();

Thread.sleep(10000);
clock.cancel();
}
A főszál egy gyermekszálat (órát) indít el, amelynek örökké futnia kell

Várjon 10 másodpercet, és  törölje a feladatot a törlési metódus hívásával.

A főszál befejezi a munkáját.

Az óraszál befejezi munkáját.

– Ezt észben fogom tartani. Köszönöm, Ellie.