"Hej, Amigo! Här är en intressant fråga som du antingen redan har haft eller så kommer du snart. Hur stoppar du en pågående tråd? "

Låt oss säga att användaren säger åt programmet att «ladda ner en fil från Internet». Huvudtråden skapar en separat underordnad tråd för det här jobbet och skickar till det ett objekt vars körningsmetod innehåller alla nödvändiga åtgärder för att ladda ner filen.

Men plötsligt ändrar användaren sig. Han vill inte ladda ner filen. Hur avbryter vi ett jobb och stoppar tråden?

"Ja, berätta hur?"

"Det kan vi inte. Det är det vanligaste och mest korrekta svaret. Du kan inte stoppa en tråd. Bara den kan stoppa sig själv. "

Men du kan skicka en signal till en tråd, på något sätt berätta att arbetet inte längre behöver utföras och att det ska avslutas. Precis som huvudtråden avslutas genom att återvända från huvudmetoden, avslutas en undertråd genom att återvända från körningsmetoden.

"Vad är det bästa sättet att göra det?"

"Du kan lägga till någon variabel, t.ex. en boolesk . Om det är sant körs tråden. Om den är falsk  ska tråden avslutas. Så här, till exempel:"

Koda Beskrivning
class Clock implements Runnable
{
public void run()
{
while (true)
{
Thread.sleep(1000);
System.out.println("Tick");

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

Klassen Clock skriver «Tick» till konsolen en gång i sekunden för alltid

Om ClockManager.isClockRun är falsk avslutas körningsmetoden.

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;
}

}
Huvudtråden startar en barntråd (klocka) som ska löpa för alltid

Vänta 10 sekunder och ge klockan en signal att sluta.

Huvudtråden avslutar sitt arbete.

Klocktråden avslutar sitt arbete.

"Tänk om vi har flera trådar, vad då?"

"Det är bäst att ha en sådan variabel för varje tråd. Det är bekvämast att lägga till den direkt i klassen. Du kan lägga till en boolesk isRun -variabel där. Det är dock bättre att lägga till en boolesk isCancel -variabel som blir sann om uppgiften är inställt."

Koda Beskrivning
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");
}
}
}
Klassen Clock skriver ordet «Tick» till konsolen en gång i sekunden så länge isCancel är falskt.

När isCancel blir sant avslutas körmetoden.

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

Thread.sleep(10000);
clock.cancel();
}
Huvudtråden startar en barntråd (klocka) som ska löpa för alltid

Vänta 10 sekunder och  avbryt uppgiften genom att anropa avbrytmetoden.

Huvudtråden avslutar sitt arbete.

Klocktråden avslutar sitt arbete.

"Jag ska ha det i åtanke. Tack, Ellie."