"Bună, Amigo! Iată o întrebare interesantă pe care fie ai avut-o deja, fie o vei avea în curând. Cum poți opri un fir de discuție? "

Să presupunem că utilizatorul spune programului să „descarce un fișier de pe Internet”. Firul principal creează un fir de execuție separat pentru acest job și îi transmite un obiect a cărui metodă de rulare conține toate acțiunile necesare pentru a descărca fișierul.

Dar dintr-o dată utilizatorul se răzgândește. Nu vrea să descarce fișierul. Cum anulăm un job și oprim firul?

— Da, spune-mi cum?

Nu putem. Acesta este cel mai obișnuit și cel mai corect răspuns. Nu poți opri un fir. Numai el se poate opri singur.

Dar puteți trimite un semnal unui fir, spunându-i într-un fel că lucrarea nu mai trebuie efectuată și că ar trebui să se încheie. Așa cum firul principal se termină prin întoarcerea de la metoda principală, un fir de execuție secundar se termină prin întoarcerea de la metoda run.

„Care este cel mai bun mod de a face asta?”

„Puteți adăuga o variabilă, cum ar fi un boolean . Dacă este adevărat , firul rulează. Dacă este fals  , firul ar trebui să se termine. Astfel, de exemplu:”

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

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

Clasa Clock scrie „Tick” pe consolă o dată pe secundă pentru totdeauna

Dacă ClockManager.isClockRun este fals, metoda de rulare se termină.

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

}
Firul principal pornește un fir copil (ceasul) care ar trebui să ruleze pentru totdeauna

Așteptați 10 secunde și dați ceasului un semnal de sfârșit.

Firul principal își finalizează munca.

Firul ceasului își încheie activitatea.

„Dacă avem mai multe fire, atunci ce?”

„Cel mai bine este să aveți o astfel de variabilă pentru fiecare fir. Cel mai convenabil este să o adăugați direct la clasă. Puteți adăuga o variabilă booleană isRun acolo. Cu toate acestea, este mai bine să adăugați o variabilă booleană isCancel care devine adevărată dacă sarcina este anulat."

Cod Descriere
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");
}
}
}
Clasa Clock scrie cuvântul «Tick» pe consolă o dată pe secundă, atâta timp cât isCancel este fals.

Când isCancel devine adevărat, metoda run se termină.

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

Thread.sleep(10000);
clock.cancel();
}
Firul principal pornește un fir copil (ceasul) care ar trebui să ruleze pentru totdeauna

Așteptați 10 secunde și  anulați sarcina apelând metoda de anulare.

Firul principal își finalizează munca.

Firul ceasului își încheie activitatea.

— Voi ține cont de asta. Mulțumesc, Ellie.