CodeGym /Java kursus /Java Multithreading /Alle nuancerne ved at afbryde/stoppe tråde

Alle nuancerne ved at afbryde/stoppe tråde

Java Multithreading
Niveau , Lektie
Ledig

"Hej, Amigo!

"Alt nyt er bare noget gammelt, som vi har glemt. I dag vil jeg tale om at stoppe tråde. Jeg håber, du allerede har glemt, hvordan interrupt()-metoden fungerer."

"Ja, Ellie, jeg har helt glemt det."

"Fint. Så minder jeg dig om det."

"I Java, hvis nogen ønsker at stoppe en kørende tråd, kan han signalere dette til tråden. For at gøre dette skal du indstille Thread-objektets skjulte isInterrupted- variabel til sand."

"Hver Thread har en interrupt()-metode, som bruges til at sætte dette flag. Når interrupt ( )-metoden kaldes, indstilles isInterrupted- variablen inde i Thread-objektet til sand."

"Og når metoden Thread.sleep() eller join() kaldes på en tråd, kontrollerer metoden, om flaget isInterrupted er sat for den aktuelle tråd. Hvis dette flag er sat (variablen isInterrupted er lig true), så er metoderne smide en InterruptedException ."

"Her vil jeg minde dig om et gammelt eksempel:"

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

while (!current.isInterrupted())
{
Thread.sleep(1000);
System.out.println("Tik");
}
}
}
Urets kørselsmetode henter Thread-objektet for den aktuelle tråd.

Clock-klassen skriver ordet "Tick" til konsollen én gang i sekundet, så længe den aktuelle tråds isInterrupt-variabel er falsk.

Når isInterrupt bliver sandt, afsluttes kørselsmetoden.

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

Thread.sleep(10000);
clockThread.interrupt();
}
Hovedtråden starter en undertråd (ur), der skal køre for evigt.

Vent 10 sekunder og annuller opgaven ved at kalde afbrydelsesmetoden.

Hovedtråden afslutter sit arbejde.

Urtråden afslutter sit arbejde.

"Her bruger vi sleep - metoden som en del af en uendelig løkke i kørselsmetoden . I løkken kontrolleres isInterrupt- variablen automatisk. Hvis en tråd kalder sleep -metoden, tjekker metoden først, om isInterrupt er sand for den tråd (den en, der kaldte sleep-metoden). Hvis det er sandt, vil metoden ikke sove. I stedet afgiver den en InterruptedException ."

"Men i dette eksempel kontrollerer vi konstant variabelen isInterrupted i løkkens tilstand."

"Jeg kan huske, at der var nogle grunde til, at vi ikke kunne bruge denne tilgang. Kan du minde mig om det?"

" For det første har kørselsmetoden ikke altid en løkke. Metoden kan simpelthen bestå af et par dusin kald til andre metoder. I dette tilfælde skal du tilføje en isInterrupted-kontrol før hvert metodekald. "

" For det andet kan en metode, der involverer mange forskellige handlinger, tage meget lang tid at udføre."

" For det tredje erstatter det at kaste en undtagelse ikke isInterrupted-kontrollen. Det er bare en praktisk tilføjelse. Den kastede undtagelse lader dig hurtigt spole opkaldsstakken tilbage til selve kørselsmetoden. "

" For det fjerde bruges søvnmetoden meget. Det viser sig, at denne nyttige metode er forbedret af en implicit kontrol, der ikke er mindre nyttig. Det er  som om ingen specifikt tilføjede checken, men der er den.  Dette er super værdifuldt, når du 'bruger en andens kode, og du kan ikke selv tilføje checken."

" For det femte forringer det ekstra tjek ikke ydeevnen. At kalde søvnmetoden betyder, at tråden ikke skal gøre noget (undtagen at sove), så det ekstra arbejde generer ingen."

"Det er præcis, hvad du sagde tidligere."

"Og hvad med din udtalelse, " Ingen kan garantere, at en tråd vil blive stoppet. Kun en tråd kan stoppe sig selv. " Kan du forklare det?

"Jo da."

"Tidligere, i tidlige versioner af Java, havde tråde en stop()-metode. Og når du kaldte den, stoppede JVM faktisk tråden. Men hvis en tråd lavede noget uden for JVM (f.eks. skrev til en fil eller ringede op). OS-funktioner), da den blev afbrudt på denne måde, forårsagede afbrydelsen en masse problemer, såsom ulukkede filer, ikke-frigivne systemressourcer osv."

"En generalforsamling for Javas skabere besluttede at fjerne metoden til at tvangsstoppe tråde. Nu kan vi kun sætte et bestemt flag (isInterrupted) og håbe på, at trådkoden er skrevet korrekt, så dette flag vil blive behandlet. Dette flag er som et skilt, der siger: 'Tråd, stop, tak. Det er meget vigtigt!'. Men om det stopper eller ej, er dens egen sag."

"Men hvad med den afbrudte undtagelse?"

"Hvad hvis koden, der kører på denne tråd, har en masse try-catch-blokke? Selvom en InterruptedException opstår et sted, er der absolut ingen garanti for, at nogle try-catch ikke fanger den og glemmer den. Så der er ingen garantier for tråden stopper."

"En anden ting er, at tråde allerede betragtes som ret lavt niveau programmering. Men det vil jeg fortælle dig om næste gang."

"Du er ikke Ellie - du er Scheherazade!"

"Så, Amigo! Er alt i den aktuelle lektion klart?"

"Ja."

"Okay godt."

Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION