"Hei, Amigo! Her er et interessant spørsmål som du enten allerede har hatt, eller du vil snart. Hvordan stopper du en pågående tråd? "

La oss si at brukeren ber programmet «laste ned en fil fra Internett». Hovedtråden oppretter en egen undertråd for denne jobben, og sender den et objekt hvis kjøremetode inneholder alle nødvendige handlinger for å laste ned filen.

Men plutselig ombestemmer brukeren seg. Han vil ikke laste ned filen. Hvordan kansellerer vi en jobb og stopper tråden?

"Ja, fortell meg hvordan?"

" Vi kan ikke. Det er det vanligste og mest korrekte svaret. Du kan ikke stoppe en tråd. Bare den kan stoppe seg selv. "

Men du kan sende et signal til en tråd, på en eller annen måte fortelle den at arbeidet ikke lenger trenger å utføres og at det bør avsluttes. Akkurat som hovedtråden avsluttes ved å returnere fra hovedmetoden, avsluttes en undertråd ved å returnere fra kjøringsmetoden.

"Hva er den beste måten å gjøre det på?"

"Du kan legge til en variabel, for eksempel en boolsk . Hvis det er sant , kjører tråden. Hvis den er usann  , bør tråden avsluttes. Som dette, for eksempel:"

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

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

Klokkeklassen skriver «Tick» til konsollen en gang i sekundet for alltid

Hvis ClockManager.isClockRun er falsk, avsluttes kjøringsmetoden.

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

}
Hovedtråden starter en barnetråd (klokke) som skal løpe for alltid

Vent 10 sekunder og gi klokken et signal om å avslutte.

Hovedtråden fullfører sitt arbeid.

Klokketråden avslutter sitt virke.

"Hva om vi har flere tråder, hva så?"

"Det er best å ha en slik variabel for hver tråd. Det er mest praktisk å legge den direkte til klassen. Du kan legge til en boolsk isRun- variabel der. Det er imidlertid bedre å legge til en boolsk isCancel -variabel som blir sann hvis oppgaven er kansellert."

Kode Beskrivelse
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");
}
}
}
Klokkeklassen skriver ordet «Tick» til konsollen en gang i sekundet så lenge isCancel er falsk.

Når isCancel blir sant, avsluttes kjøremetoden.

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

Thread.sleep(10000);
clock.cancel();
}
Hovedtråden starter en barnetråd (klokke) som skal løpe for alltid

Vent 10 sekunder og  avbryt oppgaven ved å ringe avbryt-metoden.

Hovedtråden fullfører sitt arbeid.

Klokketråden avslutter sitt virke.

"Jeg skal ha dette i bakhodet. Takk, Ellie."