Java:在子线程中处理异常

Java:在子线程中处理异常,java,multithreading,exception-handling,Java,Multithreading,Exception Handling,我更喜欢将异常处理逻辑放在调用堆栈的更上层,靠近main方法。我喜欢这种方法。。。但是,我创建了一个线程,其中run()中的一些方法调用可能会抛出异常。我真的很想看看是否有一种方法可以将这些异常抛出回父线程?我能想到的最好办法是在实现Runnable的对象内设置一个变量。此变量是一个包含错误消息的字符串,然后使用类加载器在父线程中正确地重新创建相同的异常 我想知道的是,有没有一种不那么混乱的方式来获得我想要的东西?(能够确保在子线程中抛出的任何异常都使用与在主线程/代码重用中运行时相同的异常处理

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


我想知道的是,有没有一种不那么混乱的方式来获得我想要的东西?(能够确保在子线程中抛出的任何异常都使用与在主线程/代码重用中运行时相同的异常处理逻辑进行处理)。

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

启动runnable的代码必须检查runnable,以查看是否设置了“Exception”对象,并重新引用它或处理它

如果重新播放,可能需要将其包装在新的异常中:

throw new Exception(oldException);
这将为您提供两个堆栈跟踪


(感谢Taylor L)

您可以在此处使用Executor服务来提交可调用服务并接收未来服务。此时,您至少希望将异常传播到您将调用的调用线程
future.get()

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

使用,您可以在
线程中设置,并具有处理线程异常的集中逻辑


此外,您还可以编写自己的程序,使用预设的
线程创建线程。UncaughtExceptionHandler

我认为fillInStackTrace将替换当前堆栈帧,而不是异常的原始堆栈帧。我不确定那是你想要的。也许最好用一个新的异常来包装异常,比如抛出新的YourException(originalException)。剩下的似乎没问题。这个问题似乎在这里被问了很多。。。我会考虑关闭它,但是在读了更多的文章之后,这个问题会问不同的问题:使用类加载器+保存可运行对象中的异常吗?显然它不是Bill K. Thanks所指出的。我想我唯一的问题是<代码>线程。UncaughtExceptionHandler < /代码>强迫我。在那里处理异常,但我想把它放回main()的几个堆栈中。Futures是Java中使用最不充分的特性之一。我需要的直接线程使用中,有一半以上可以通过Futures更安全、更简单、更便宜地完成。@James Your 100%正确,Futures即使是一个简单的同步障碍也比更知名的CountdownLatch和CountdownLatch容易得多CyclicBarrier@JohnVint-小费不错。一个问题-即使在子线程死后(在抛出runtimeException之后)调用future.get()也会抛出异常@AndyDufresne是的。Future本身缓冲从现在已死亡的线程传播的异常。当您调用
get
时,它将检查缓冲异常是否为非null,如果不是,它将抛出它(这至少适用于当前的实现,文档不一定这样说,但我认为它将保持不变)。