我在java中编写了一些代码,通过在包装器(单独的类)中对它们进行排队,将异常从一个线程推送到主线程。现在,如果包装器中存在任何异常,则线程将死亡。然后必须在主线程上抛出异常。似乎没有在主线程上调用的标准java事件,所以我不得不在某个地方的线程上使用join函数。我不能在主线程中使用join,因为那时主线程阻塞。我不能在另一个线程中使用它,然后我不能再抛出异常了。我想不出在主线程上抛出异常的任何其他方法。这里有人有想法吗?
答案 0 :(得分:3)
使用ExecutorService执行线程和Future.get()以获取已执行任务的结果和/或发生的任何异常。
答案 1 :(得分:1)
使用ExecutorService执行线程和Future.get()以获取已执行任务的结果和/或发生的任何异常。
答案 2 :(得分:0)
如@Ryan Stewart所述,您可以使用Executros框架。在这种情况下,你不自己创建线程:大哥帮助你做到这一点。您可以使用Callable而不是Runnable来实现您的逻辑。在这种情况下,您可以获取Future并询问它的线程状态。
不幸的是,我担心这只能帮助你,因为你必须积极地打电话给Future。
如果我理解正确,您希望在其中一个wrorker线程抛出异常时通知您的主线程。我不认为你应该从工作线程获得异常并将其重新抛入主线程中。
我建议您使用以下策略之一。
A. 使用侦听器模式。创建
interface ExceptionListener {
public void exceptionThrown(Exception e);
}
创建abstract class ExceptionNotifierThread extends Thread
。
该类将包含ExceptionListener和方法addExceptionListener(ExceptionListener l)
。
线程的方法run()
将捕获所有异常,然后在循环中调用所有除外侦听器。
现在你创建了你的线程,在调用它的start()
方法之前,你可以注册为一个excption listener。
就是这样。当线程抛出异常时,你的侦听器将被回调。
B. 这是同一解决方案的一个版本。只是代替通知侦听器同步线程我的推送排除队列,每个人都可以从队列中读取它。用户执行程序和阻止队列。
祝你好运,欢迎来到stackoverflow!