Jeśli wywołać metodę run() na wątku, a metoda run() rzuca niezręczny wyjątek, jaki byłby wynik?co się dzieje, gdy wątek wyrzuca wyjątek?
Kto łapie ten wyjątek? Czy nawet zostanie złapany?
Jeśli wywołać metodę run() na wątku, a metoda run() rzuca niezręczny wyjątek, jaki byłby wynik?co się dzieje, gdy wątek wyrzuca wyjątek?
Kto łapie ten wyjątek? Czy nawet zostanie złapany?
Jeśli w grupie wątków jest zainstalowany moduł obsługi wyjątku, maszyna JVM przekazuje do niego wyjątek. Jeśli jest to wątek AWT, możesz zainstalować procedurę obsługi zdarzeń dla nieobsługiwanych wyjątków. W przeciwnym razie JVM go obsługuje.
Przykład grupy gwintu z niestandardowej obsługi i jak go używać:
public class MyThreadGroup extends ThreadGroup {
public MyThreadGroup() {
super("My Thread Group");
}
public void uncaughtException(Thread t, Throwable ex) {
// Handle exception
}
}
Thread t = new Thread(new MyThreadGroup(), "My Thread") { ... };
t.start();
przykład wykorzystania programu obsługi wyjątków AWT:
public class MyExceptionHandler {
public void handle(Throwable ex) {
// Handle exception
}
public void handle(Thread t, Throwable ex) {
// Handle exception
}
}
System.setProperty("sun.awt.exception.handler", MyExceptionHandler.class.getName());
"W przeciwnym razie JVM go obsługuje." Aby być bardziej precyzyjnym, wątek, który podniósł wyjątek, cicho umrze. –
@ Step: Właściwie to wypisuje wyjątek na stderr. – Draemon
Naprawdę? Musi to być konkretna maszyna JVM ... ponieważ zostałem potknięty przez brak śledzenia stosu. –
Może to zrobić, jeśli zostanie przypisana do ThreadGroup, która implementuje metodę uncaughtException(Thread, Throwable).
Jeśli złożona Runnable do ExecutorService możesz złapać wyjątek jako zapakowany wewnątrz ExecutionException. (Bardzo zalecane po prostu wywoływanie polecenia run())
Aby było to bardziej zrozumiałe - nie uruchamiasz run() - wywołujesz start() na wątku, aby kod w metodzie run() działał w nowym wątek. Wywołanie metody run() bezpośrednio powoduje wykonanie metody run w bieżącym wątku. – Nate