Java:子线程中的异常

时间:2009-11-30 13:01:23

标签: java exception-handling

在Java中,如果我从A类中的main方法开始一个线程T,并且在T中发生异常,那么A中的main方法将如何知道这一点。如果我没有错,A类的实例和线程T将出现在两个独立的堆栈中,对,那么,线程的父节点如何了解异常?

3 个答案:

答案 0 :(得分:6)

简短回答,但事实并非如此。如果异常一直传播出线程,它就会死掉(可能在控制台上产生一些错误)。

你可能感兴趣的是捕获最外层堆栈框架中的所有异常(即启动线程的run-method),它将异常放在队列或其他通信机制上(可能还有一些)线程终止之前的元数据,如线程ID等。然后由父线程定期查询队列(或使用其他一些通知机制来唤醒父线程,例如wait / notify或Condition-objects)。

答案 1 :(得分:4)

您可以覆盖UncaughtExceptionHandler,而不是使用try / catch块包围线程代码并通知先前注释中已解释过的父线程。该机制详细描述here。您还可以在Java文档中查找Interface Thread.UncaughtExceptionHandler

我认为这比try / catch块更好一些,因为通知父线程的机制与线程代码分离,可以重用于其他线程。

答案 2 :(得分:0)

如果没有人明确通知线程,它将不会注意到。也许UncaughtExceptionHandler可以帮助您捕捉未捕获的异常。另外,您需要一种通知主线程的方法 这可以通过调用interrupt()或使用管道,notify()/ condition.await()等来完成。