"Hej, Amigo! Du måste erkänna att Ellies Cancel-idé var briljant."
"Japp."
"Faktiskt finns något liknande i klassen Thread . Bara variabeln heter inte isCancel . Den heter isInterrupt . Och metoden som används för att stoppa tråden är inte cancel( ) . Det är interrupt() ."
"Verkligen?"
"Ja. Kolla in det:"
Koda | Beskrivning |
---|---|
|
Eftersom flera trådar kan anropa körmetoden på samma Clock-objekt, får vi Thread-objektet för den aktuella tråden .
Klassen Clock skriver ordet "Tick" till konsolen en gång i sekunden så länge som den aktuella trådens isInterrupt- variabel är falsk. När isInterrupt blir sant avslutas körmetoden . |
|
Huvudtråden startar en barntråd (klocka) som ska löpa för alltid.
Vänta 10 sekunder och avbryt uppgiften genom att anropa avbrottsmetoden . Huvudtråden avslutar sitt arbete. Klocktråden avslutar sitt arbete. |
Dessutom kontrollerar sömnmetoden , som folk är så förtjusta i att använda i ändlösa loopar i körmetoden, automatiskt variabeln isInterrupt . Om en tråd anropar vilometoden , kontrollerar metoden först om isInterrupt är sant för den tråden. Om det är sant, kommer metoden inte att sova. Istället kastar den ett InterruptedException- undantag.
"Varför göra ett undantag? Skulle det inte vara bättre att helt enkelt lägga isInterrupted() istället för isCancel() i en loop?"
" För det första har körmetoden inte alltid en loop. Metoden kan helt enkelt bestå av några dussin anrop till andra metoder. Sedan måste du lägga till en isInterrupted-kontroll före varje metodanrop. "
" För det andra kan en metod som involverar många olika åtgärder ta mycket lång tid att utföra."
" För det tredje , att kasta ett undantag ersätter inte isInterrupted-kontrollen. Det är bara ett bekvämt tillägg. Det kastade undantaget låter dig snabbt avveckla samtalsstacken tillbaka till själva körmetoden. "
" För det fjärde används sömnmetoden mycket. Det visar sig att den här hjälpsamma metoden förstärks av en implicit kontroll som inte är mindre användbar. Det är som om ingen specifikt lagt till kontrollen, men där är den. Detta är mycket värdefullt när du använder någon annans kod och du kan inte lägga till kontrollen själv."
" För det femte , den extra kontrollen försämrar inte prestandan. Att anropa sömnmetoden betyder att tråden inte ska göra någonting (förutom att sova), så det extra arbetet stör ingen."
"Det är allvarliga argument."
"Och slutligen finns det här: Din körmetod kan anropa någon annans kod - kod som du inte har tillgång till (källkod och/eller rättigheter att ändra koden). Den kanske inte har avbrutna kontroller, och den kan använda " försök ... fånga (Undantag e) " för att fånga alla undantag."
Ingen kan garantera att en tråd kommer att stoppas. Bara en tråd kan stoppa sig själv.
GO TO FULL VERSION