Java:处理子线程中的异常

Zom*_*ies 10 java multithreading exception-handling

我更喜欢在main方法附近的调用堆栈中进一步使用异常处理逻辑.我喜欢这种方法...但是,我创建了一个线程,其中run()内部的一些方法调用可能会抛出异常.我真的想看看是否有一种方法可以将这些异常抛回到父线程?我能想到的最好的方法是在实现的对象中设置一个变量Runnable.此变量是一个包含错误消息的字符串,然后使用类加载器在父线程中正确地重新创建相同的异常.

我想知道的是,是否有一种不那么混乱的方式来获得我想要的东西?(为了能够确保使用相同的异常处理逻辑处理子线程中抛出的任何异常,就好像它在主线程/代码重用中运行一样).

Joh*_*int 26

您可以在此处使用ExecutorService来提交可调用对象并接收Future.在这一点上,您至少希望将Exception传播到您将调用的调用线程future.get()

future.get()会将调用方法中抛出的任何异常传播给调用future.get()的线程.因此,如果您的主线程调用future.get(),那么主线程将看到抛出的任何异常.

  • Futures是Java中使用最少的功能之一.使用Futures,我需要的直接线程使用量的一半以上可以更安全,更容易,更便宜. (3认同)
  • @AndyDufresne是的.Future本身缓冲从现在死线程传播的异常.当你调用`get`时,它将检查缓冲的异常是否为非null,如果不是则抛出它(这至少适用于当前的实现,doc不一定说这个但是我会想象它会保持不变). (3认同)

Bil*_*l K 4

在 run() 方法的外层捕获它,然后将异常放置在 Runnable 的变量中,并让 Runnable 指示它已完成。

然后,启动可运行对象的代码必须检查可运行对象以查看是否设置了“异常”对象,然后重新抛出它或处理它。

如果重新抛出它,您可能需要将其包装在新的异常中:

throw new Exception(oldException);
Run Code Online (Sandbox Code Playgroud)

这将为您提供两个堆栈跟踪。

(谢谢泰勒大号)