线程抛出异常时会发生什么?

时间:2009-07-28 10:22:10

标签: java multithreading

如果我在线程上调用run()方法并且run()方法会抛出未捕获的异常会产生什么结果?

谁抓住了例外 Exception 是否被捕获?

3 个答案:

答案 0 :(得分:9)

如果为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());

答案 1 :(得分:1)

如果您已将Runnable提交给ExecutorService,则可以捕获包含在ExecutionException内的异常。 (强烈推荐简单地调用run())

答案 2 :(得分:0)

如果您将其分配给实施ThreadGroup方法的 uncaughtException(Thread, Throwable),则可以。