"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 |
---|---|
|
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ă. |
|
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.
GO TO FULL VERSION