"Hej Amigo!

"Allt nytt är bara något gammalt som vi har glömt. Idag ska jag prata om att stoppa trådar. Jag hoppas att du redan har glömt hur interrupt()-metoden fungerar."

"Ja, Ellie, jag har helt glömt det."

"Bra. Då ska jag påminna dig."

"I Java, om någon vill stoppa en pågående tråd, kan han signalera detta till tråden. För att göra detta måste du ställa in Thread-objektets dolda isInterrupted -variabel till true."

"Varje tråd har en interrupt()-metod, som används för att ställa in denna flagga. När interrupt ()-metoden anropas, är variabeln isInterrupted inuti Thread-objektet satt till true."

"Och när metoden Thread.sleep() eller join() anropas på en tråd, kontrollerar metoden om flaggan isInterrupted är inställd för den aktuella tråden. Om denna flagga är inställd (variabeln isInterrupted är lika med true), metoderna kasta ett InterruptedException ."

"Här ska jag påminna dig om ett gammalt exempel:"

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

while (!current.isInterrupted())
{
Thread.sleep(1000);
System.out.println("Tik");
}
}
}
Klockans körningsmetod hämtar Thread-objektet för den aktuella tråden.

Klassen Clock skriver ordet "Tick" till konsolen en gång per sekund så länge som den aktuella trådens isInterrupt-variabel är falsk.

När isInterrupt blir sant avslutas körmetoden.

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

Thread.sleep(10000);
clockThread.interrupt();
}
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.

"Här använder vi sleep -metoden som en del av en oändlig loop i körmetoden . I loopen kontrolleras variabeln isInterrupt automatiskt. Om en tråd anropar sleep -metoden, kontrollerar metoden först om isInterrupt är sant för den tråden (den en som kallade sömnmetoden). Om det är sant, kommer metoden inte att sova. Istället kastar den ett InterruptedException ."

"Men i det här exemplet kontrollerar vi konstant variabeln isInterrupted i slingans tillstånd."

"Jag minns att det fanns några anledningar till att vi inte kunde använda det här tillvägagångssättet. Kan du påminna mig?"

" 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. I det här fallet 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.  Det här ä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 försämrar inte den extra kontrollen prestandan. Att anropa sömnmetoden betyder att tråden inte ska göra någonting (förutom att sova), så extraarbetet stör ingen."

"Det är precis vad du sa tidigare."

"Och hur är det med ditt uttalande, " Ingen kan garantera att en tråd kommer att stoppas. Bara en tråd kan stoppa sig själv." Kan du förklara det?

"Säker."

"Tidigare, i tidiga versioner av Java, hade trådar en stop()-metod. Och när du anropade den stoppade JVM faktiskt tråden. Men om en tråd gjorde något utanför JVM (till exempel skrev till en fil eller anropade OS-funktioner) när det avbröts på detta sätt, orsakade avbrottet många problem, såsom oavslutna filer, outgivna systemresurser, etc."

"Ett generalmöte för Javas skapare beslutade att ta bort metoden för att tvångsstoppa trådar. Nu kan vi bara sätta en viss flagga (isInterrupted) och hoppas att trådkoden skrevs korrekt, så att denna flagga kommer att behandlas. Denna flagga är som en skylt som säger: 'Trä, sluta, snälla. Det är väldigt viktigt!'. Men om det slutar eller inte är dess egen sak."

"Men hur är det med InterruptedException?"

"Tänk om koden som körs på den här tråden har ett gäng try-catch-block? Även om ett InterruptedException inträffar någonstans, finns det definitivt ingen garanti för att någon try-catch inte kommer att fånga det och glömma det. Så det finns inga garantier för tråden kommer att sluta."

"En annan sak är att trådar redan anses vara ganska lågnivåprogrammering. Men det ska jag berätta om nästa gång."

"Du är inte Ellie - du är Scheherazade!"

"Så, Amigo! Är allt i den aktuella lektionen klart?"

"Japp."

"Okay bra."