【发布时间】:2018-08-29 14:46:07
【问题描述】:
在 Java 中,如果我从 A 类的主方法启动线程 T,并且 T 中发生异常,A 中的主方法将如何知道这一点。如果我没看错的话,A 类的实例和线程 T 将存在于两个独立的堆栈中,对,那么,线程的父级是如何知道异常的呢?
【问题讨论】:
-
here 的问题可能很有趣,尽管它可能不是直接的答案。
在 Java 中,如果我从 A 类的主方法启动线程 T,并且 T 中发生异常,A 中的主方法将如何知道这一点。如果我没看错的话,A 类的实例和线程 T 将存在于两个独立的堆栈中,对,那么,线程的父级是如何知道异常的呢?
【问题讨论】:
简短的回答,它没有。如果异常一直传播到线程之外,它就会死掉(可能会在控制台上生成一些错误打印)。
您可能有兴趣做的是在最外层的堆栈帧(即启动线程的运行方法)中捕获所有异常,这会将异常放在队列或其他通信机制中(可能连同一些线程终止之前的元数据,例如线程 ID 等)。然后由父线程定期查询队列(或使用其他一些通知机制来唤醒父线程,例如等待/通知或条件对象)。
【讨论】:
您可以覆盖UncaughtExceptionHandler,而不是用try/catch 块包围线程代码并通知父线程,如前面的cmets 中已经解释的那样。该机制详细描述here。您还可以查看 Interface Thread.UncaughtExceptionHandler 的 Java 文档。
我认为它比 try/catch 块稍微好一点,因为通知父线程的机制与线程代码解耦,可以重复用于其他线程。
【讨论】:
如果没有人明确通知线程,它不会注意到。也许UncaughtExceptionHandler 可以帮助您捕获未捕获的异常。另外,您需要一种通知主线程的方法。
这可以通过调用 interrupt() 或使用管道、notify()/condition.await() 等来完成。
【讨论】: