CodeGym /Java kursus /Modul 2: Java Core /Stoppe tråde: den officielle version

Stoppe tråde: den officielle version

Modul 2: Java Core
Niveau , Lektie
Ledig

"Hej, Amigo! Du må indrømme, at Ellies Cancel-idé var genial."

"Ja."

"Faktisk eksisterer noget lignende i Thread- klassen. Kun variablen hedder ikke isCancel . Den hedder isInterrupt . Og metoden, der bruges til at stoppe tråden, er ikke cancel() . Den er interrupt() ."

"Virkelig?"

"Ja. Tjek det ud:"

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

while (!current.isInterrupted())
{
Thread.sleep(1000);
System.out.println("Tick");
}
}
}
Fordi flere tråde kan kalde kørselsmetoden på det samme Clock-objekt, får vi Thread-objektet for den aktuelle tråd .

Clock-klassen skriver ordet "Tick" til konsollen en 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 fuldender sit arbejde.

Urtråden afslutter sit arbejde.

Desuden tjekker søvnmetoden , som folk er så glade for at bruge i endeløse loops i kørselsmetoden , automatisk isInterrupt- variablen. Hvis en tråd kalder sleep - metoden, kontrollerer metoden først, om isInterrupt er sandt for den tråd. Hvis det er sandt, vil metoden ikke sove. I stedet kaster den en InterruptedException -undtagelse.

"Hvorfor smide en undtagelse? Ville det ikke være bedre blot at sætte isInterrupted() i stedet for isCancel() i en løkke?"

" For det første har kørselsmetoden ikke altid en løkke. Metoden kan ganske enkelt bestå af et par dusin kald til andre metoder. Så 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. Som det viser sig, er denne nyttige metode 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 seriøse argumenter."

"Og til sidst er der dette: Din kørselsmetode kan kalde en andens kode - kode, som du ikke har adgang til (kildekode og/eller rettigheder til at ændre koden). Den har muligvis ikke isInterrupted checks, og den kan bruge " prøv ... catch (Undtagelse e) " for at fange alle undtagelser."

Ingen kan garantere, at en tråd bliver stoppet. Kun en tråd kan stoppe sig selv.

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