CodeGym /Java kurs /Java Multithreading /Anropsstakken og fangefeil

Anropsstakken og fangefeil

Java Multithreading
Nivå , Lekse
Tilgjengelig

"Hei, Amigo!

"Jeg vil fortelle deg om noe lite, men interessant."

"Jeg lytter. Jeg elsker ting som er små og interessante."

"Vel, du vet at hvert Thread-objekt har en run()-metode. Og at du kan kjøre den på en separat tråd ved å bruke start()-metoden."

"Ja, selvfølgelig."

"Men se for deg denne situasjonen: du starter en tråd for å utføre noe arbeid, men et unntak blir kastet og tråden slutter å kjøre fordi den ikke vet hva den skal gjøre. Vil du ikke vite om denne feilen på en eller annen måte?"

"Jeg er enig. Jeg må på en eller annen måte fange unntaket som skjedde i den andre tråden som kjører. Støtter Java til og med det?"

"Du fornærmer meg. Selvfølgelig gjør det det."

"Javas skapere oppfant et spesielt grensesnitt kalt UncaughtExceptionHandler. Slik fanger og håndterer du et unntak som oppstår på en annen tråd, hvis den tråden ikke fanger det:"

Eksempel
public class DownloadManager
{
 public static void main(String[] args)
 {
   Thread thread = new DownloadThread();
   thread.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler()
   {
    @Override
    public void uncaughtException(Thread t, Throwable e)
    {

    }
 });

 thread.start();
}

"Thread-objektet har en spesiell setUncaughtExceptionHandler -metode. Du må sende det et objekt som implementerer Thread.UncaughtExceptionHandler- grensesnittet. Dette grensesnittet har bare én metode: uncaughtException(Thread t, Throwable e) . Dette er metoden som vil bli kalt på det beståtte objektet hvis et ufanget unntak oppstår i kjøringsmetoden."

"I mitt eksempel ovenfor erklærer jeg ganske enkelt en anonym indre klasse (uthevet i rødt) som implementerer Thread.UncaughtExceptionHandler- grensesnittet . Og jeg overstyrer dens uncaughtException(Thread t, Throwable e) -metoden."

"Som du kan se fra metodens parameterliste, vil to argumenter bli sendt: en referanse til Thread-objektet der unntaket skjedde, og selve unntaket, sendt som Throwable e."

"Vel, hvorfor trenger jeg Thread-variabelen t? Vet vi ikke allerede hvilken Thread vi legger et Thread.UncaughtExceptionHandler- objekt i?"

"De gjorde dette slik at du kan skrive en universell behandler for disse situasjonene. dvs. du kan lage et enkelt objekt og sende det til dusinvis av forskjellige tråder. Deretter gir uncaughtException( Thread t, Throwable e) -metoden deg alltid en referanse til Trådobjekt der unntaket skjedde."

"I tillegg kan du lage dusinvis av tråder, for eksempel i en løkke for å utføre spesifikke oppgaver. Generelt vil ikke denne referansen til Thread-objektet være overflødig. Jeg lover deg det."

"Jeg tror deg. Du har aldri tatt feil."

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