"Hallo, Amigo! Hier is een interessante vraag die je al hebt gehad of binnenkort zult krijgen. Hoe stop je een lopende draad? "

Laten we zeggen dat de gebruiker het programma vertelt om «een bestand van internet te downloaden». De hoofdthread maakt een aparte onderliggende thread voor deze taak en geeft deze een object door waarvan de run-methode alle noodzakelijke acties bevat om het bestand te downloaden.

Maar plotseling bedenkt de gebruiker zich. Hij wil het bestand niet downloaden. Hoe annuleren we een taak en stoppen we de thread?

"Ja, vertel me hoe?"

" Dat kunnen we niet. Dat is het meest voorkomende en meest correcte antwoord. Je kunt een thread niet stoppen. Alleen hij kan zichzelf stoppen. "

Maar je kunt wel een signaal naar een thread sturen om hem op de een of andere manier te vertellen dat het werk niet langer hoeft te worden uitgevoerd en dat het moet worden beëindigd. Net zoals de hoofdthread eindigt door terug te keren van de main-methode, eindigt een onderliggende thread door terug te keren van de run-methode.

"Wat is de beste manier om dat te doen?"

"Je kunt een variabele toevoegen, zoals een boolean . Als het waar is , wordt de thread uitgevoerd. Als het onwaar is  , moet de thread eindigen. Zoals dit, bijvoorbeeld:"

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

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

De klasse Clock schrijft voor altijd een keer per seconde «Tick» naar de console

Als ClockManager.isClockRun onwaar is, wordt de run-methode beëindigd.

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

}
De hoofdthread start een kinderthread (klok) die voor altijd zou moeten lopen

Wacht 10 seconden en geef de klok een signaal om te stoppen.

De rode draad voltooit zijn werk.

De klokdraad beëindigt zijn werk.

"Wat als we meerdere threads hebben, wat dan?"

"Het is het beste om zo'n variabele voor elke thread te hebben. Het is het handigst om deze rechtstreeks aan de klasse toe te voegen. Je zou daar een booleaanse isRun -variabele kunnen toevoegen. Het is echter beter om een ​​booleaanse isCancel- variabele toe te voegen die waar wordt als de taak geannuleerd."

Code Beschrijving
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");
}
}
}
De klasse Clock schrijft eenmaal per seconde het woord «Tick» naar de console zolang isCancel onwaar is.

Wanneer isCancel waar wordt, wordt de methode run beëindigd.

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

Thread.sleep(10000);
clock.cancel();
}
De hoofdthread start een kinderthread (klok) die voor altijd zou moeten lopen

Wacht 10 seconden en  annuleer de taak door de annuleermethode aan te roepen.

De rode draad voltooit zijn werk.

De klokdraad beëindigt zijn werk.

'Ik zal dit in gedachten houden. Bedankt, Ellie.'