线程中的Java异常

时间:2011-07-31 19:52:47

标签: java multithreading exception

我在java中编写了一些代码,通过在包装器(单独的类)中对它们进行排队,将异常从一个线程推送到主线程。现在,如果包装器中存在任何异常,则线程将死亡。然后必须在主线程上抛出异常。似乎没有在主线程上调用的标准java事件,所以我不得不在某个地方的线程上使用join函数。我不能在主线程中使用join,因为那时主线程阻塞。我不能在另一个线程中使用它,然后我不能再抛出异常了。我想不出在主线程上抛出异常的任何其他方法。这里有人有想法吗?

3 个答案:

答案 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!