CodeGym /Java kurs /Modul 2: Java Core /Stoppe tråder: den offisielle versjonen

Stoppe tråder: den offisielle versjonen

Modul 2: Java Core
Nivå , Lekse
Tilgjengelig

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

"Japp."

"Faktisk finnes det noe lignende i Thread- klassen. Bare variabelen heter ikke isCancel . Den heter isInterrupt . Og metoden som brukes for å stoppe tråden er ikke cancel() . Det er interrupt() ."

"Egentlig?"

"Ja. Sjekk det ut:"

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åder kan kalle kjøremetoden på samme Clock-objekt, får vi Thread-objektet for gjeldende tråd .

Klokkeklassen skriver ordet "Tick" til konsollen en gang i sekundet så lenge den gjeldende trådens isInterrupt- variabel er falsk.

Når isInterrupt blir sant ,  avsluttes kjøremetoden .

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 barnetråd (klokke) som skal løpe for alltid.

Vent 10 sekunder og  avbryt oppgaven ved å ringe avbruddsmetoden .

Hovedtråden fullfører sitt arbeid.

Klokketråden avslutter sitt virke.

Dessuten sjekker søvnmetoden , som folk er så glad i å bruke i endeløse løkker i kjøremetoden , automatisk isInterrupt -variabelen. Hvis en tråd kaller dvalemetoden , sjekker metoden først om isInterrupt er sant for den tråden. Hvis det er sant, vil ikke metoden sove. I stedet kaster den et InterruptedException- unntak.

"Hvorfor kaste et unntak? Ville det ikke vært bedre å bare sette isInterrupted() i stedet for isCancel() i en løkke?"

" For det første har ikke kjøremetoden alltid en løkke. Metoden kan ganske enkelt bestå av noen få dusin kall til andre metoder. Deretter må du legge til en isInterrupted-sjekk før hvert metodekall."

" For det andre kan en metode som involverer mange forskjellige handlinger ta veldig lang tid å utføre."

" For det tredje erstatter ikke det å kaste et unntak isInterrupted-kontrollen. Det er bare et praktisk tillegg. Det kastede unntaket lar deg raskt trekke tilbake anropsstakken tilbake til selve kjøringsmetoden. "

" For det fjerde brukes søvnmetoden mye. Som det viser seg, er denne nyttige metoden forbedret av en implisitt kontroll som ikke er mindre nyttig. Det er som om ingen spesifikt har lagt til sjekken, men der er den. Dette er veldig verdifullt når du bruker en annens kode, og du kan ikke legge til sjekken selv."

" For det femte forringer ikke tilleggskontrollen ytelsen. Å kalle søvnmetoden betyr at tråden ikke skal gjøre noe (bortsett fra å sove), så ekstraarbeidet plager ingen."

– Det er alvorlige argumenter.

"Og til slutt er det dette: Kjøremetoden din kan kalle noen andres kode – kode som du ikke har tilgang til (kildekode og/eller rettigheter til å endre koden). Den har kanskje ikke isAvbrutte kontroller, og den kan bruke " prøv ... catch (Unntak e) " for å fange opp alle unntak."

Ingen kan garantere at en tråd vil bli stoppet. Bare en tråd kan stoppe seg selv.

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