Что происходит, когда нить бросает исключение?

Если я вызываю метод run() в потоке, а метод run() бросает неискушенное исключение, каков будет результат?

Кто ловит это исключение? Его даже поймают?

Ответ 1

Если для ThreadGroup установлен обработчик исключений, JVM передает ему исключение. Если это поток AWT, вы можете установить обработчик событий для других необработанных исключений. В противном случае JVM обрабатывает его.

Пример группы потоков с пользовательским обработчиком и как его использовать:

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();

Пример использования обработчика исключений 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());

Ответ 2

Если вы отправили Runnable в ExecutorService, вы можете поймать Исключение как завернутое внутри ExecutionException. (Очень рекомендуется для простого вызова run())