"Bună, Amigo! Trebuie să recunoști că ideea Cancel a lui Ellie a fost genială."

"Da."

"De fapt, ceva similar există în clasa Thread . Numai variabila nu se numește isCancel . Se numește isInterrupt . Și metoda folosită pentru a opri firul nu este cancel() . Este interrupt() ."

"Într-adevăr?"

"Da. Verificați:"

Cod Descriere
class Clock implements Runnable
{
public void run()
{
Thread current = Thread.currentThread();

while (!current.isInterrupted())
{
Thread.sleep(1000);
System.out.println("Tick");
}
}
}
Deoarece mai multe fire pot apela metoda run pe același obiect Clock, obținem obiectul Thread pentru firul curent .

Clasa Clock scrie cuvântul „Tick” în consolă o dată pe secundă, atâta timp cât variabila isInterrupt a firului curent este falsă.

Când isInterrupt 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);
clockThread.interrupt();
}
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 întrerupere .

Firul principal își finalizează munca.

Firul ceasului își încheie activitatea.

Mai mult, metoda sleep , pe care oamenii le place atât de mult să o folosească în bucle nesfârșite în metoda de rulare , verifică automat variabila isInterrupt . Dacă un fir apelează metoda sleep , metoda verifică mai întâi dacă isInterrupt este adevărată pentru acel thread. Dacă este adevărat, metoda nu va dormi. În schimb, aruncă o excepție InterruptedException .

"De ce să aruncăm o excepție? Nu ar fi mai bine să puneți pur și simplu isInterrupted() în loc de isCancel() într-o buclă?"

În primul rând , metoda de rulare nu are întotdeauna o buclă. Metoda poate consta pur și simplu din câteva zeci de apeluri către alte metode. Apoi ar trebui să adăugați o verificare isInterrupted înainte de fiecare apel de metodă.”

În al doilea rând , o metodă care implică o mulțime de acțiuni diferite ar putea dura mult timp pentru a fi executată.”

În al treilea rând , aruncarea unei excepții nu înlocuiește verificarea isInterrupted. Este doar o adăugare convenabilă. Excepția aruncată vă permite să derulați rapid stiva de apeluri înapoi la metoda de rulare în sine.”

" În al patrulea rând , metoda somnului este folosită foarte mult. După cum se dovedește, această metodă utilă este îmbunătățită de o verificare implicită care nu este mai puțin utilă. Este ca și cum nimeni nu a adăugat cecul în mod specific, dar iată-l. Acest lucru este super valoros atunci când folosești codul altcuiva și nu poți adăuga singur cecul."

" În al cincilea rând , verificarea suplimentară nu degradează performanța. Apelarea metodei sleep înseamnă că firul nu ar trebui să facă nimic (cu excepția somnului), așa că munca suplimentară nu deranjează pe nimeni."

— Sunt argumente serioase.

„Și, în cele din urmă , este următorul: metoda ta de rulare poate apela codul altcuiva — cod la care nu ai acces (codul sursă și/sau drepturi de a schimba codul). Este posibil să nu aibă verificări isInterrupted și ar putea folosi " try ... catch (Exception e) " pentru a prinde toate excepțiile."

Nimeni nu poate garanta că un thread va fi oprit. Doar un fir se poate opri singur.