"Cześć Amigo!
„Chcę ci opowiedzieć o czymś małym, ale interesującym”.
„Słucham. Uwielbiam rzeczy, które są małe i interesujące”.
„Cóż, wiesz, że każdy obiekt Thread ma metodę run(). I że możesz ją wykonać w osobnym wątku, używając metody start()”.
"Oczywiście, że tak."
„Ale teraz wyobraź sobie taką sytuację: uruchamiasz wątek, aby wykonać jakąś pracę, ale zgłaszany jest wyjątek i wątek przestaje działać, ponieważ nie wie, co robić. Czy nie musiałbyś jakoś wiedzieć o tym błędzie?”
„Zgadzam się. Musiałbym jakoś przechwycić wyjątek, który wystąpił w innym uruchomionym wątku. Czy Java to w ogóle obsługuje?”
- Obrażasz mnie. Oczywiście, że tak.
„Twórcy Javy wymyślili specjalny interfejs o nazwie UncaughtExceptionHandler. Oto jak przechwycić i obsłużyć wyjątek występujący w innym wątku, jeśli ten wątek go nie przechwyci:”
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();
}
„Obiekt Thread ma specjalną metodę setUncaughtExceptionHandler . Musisz przekazać mu obiekt implementujący interfejs Thread.UncaughtExceptionHandler . Ten interfejs ma tylko jedną metodę: uncaughtException(Thread t, Throwable e) . Jest to metoda, która zostanie wywołana przekazany obiekt, jeśli w metodzie run wystąpi nieprzechwycony wyjątek."
„W powyższym przykładzie po prostu deklaruję anonimową klasę wewnętrzną (podświetloną na czerwono), która implementuje interfejs Thread. Thread.UncaughtExceptionHandler . I zastępuję jej metodę uncaughtException(Thread t, Throwable e) ”.
„Jak widać z listy parametrów metody, zostaną przekazane dwa argumenty: odwołanie do obiektu Thread, w którym wystąpił wyjątek, oraz sam wyjątek, przekazany jako Throwable e.”
„Cóż, po co mi zmienna Thread t? Czy nie wiemy już, w którym wątku umieszczamy obiekt Thread.UncaughtExceptionHandler ?”
„Zrobili to po to, abyś mógł napisać uniwersalną procedurę obsługi takich sytuacji, tj. możesz stworzyć pojedynczy obiekt i przekazać go do dziesiątek różnych wątków. Wtedy metoda uncaughtException (Thread t, Throwable e) zawsze daje odniesienie do Obiekt wątku, w którym wystąpił wyjątek."
„Co więcej, można tworzyć dziesiątki wątków, np. w pętli, do wykonywania określonych zadań. Ogólnie rzecz biorąc, to odwołanie się do obiektu Thread nie będzie zbyteczne. Obiecuję”.
- Wierzę ci. Nigdy się nie myliłeś.
GO TO FULL VERSION