如果执行程序服务的其中一个callables遇到错误,如何在控制台中记录错误

时间:2015-06-18 13:07:19

标签: java multithreading executorservice

我有一个使用executorService的程序,我正在通过callables

每个类都是实现java.util.concurrent.Callable的一个类的对象。

然后调用executorService。在java.lang.NoClassDefFoundError方法中的一个可调用对象的中间抛出call()

然而,它不会终止也不会登录控制台。因此无法知道程序是否正常工作。请以任何方式建议我能理解相同的内容。

3 个答案:

答案 0 :(得分:2)

Callable抛出一个异常,它不是NoClassDefFoundError的超类。在你的Callable中,捕获Error(甚至是Throwable)并用异常包装它:

V call() throws Exception
{
    try
    {
       return this.doSomething();
    } catch (Error e) {
      e.printStackTrace();
      throw new Exception(e);
    }
}

答案 1 :(得分:2)

要将错误打印到控制台,您可以创建Thread.UncaughtExceptionHander。将其传递给Thread#setDefaultUncaughtThreadExceptionHandler将导致在抛出错误时调用处理程序。

答案 2 :(得分:0)

有人已经发布了这个问题的答案,但是当我在验证后将其标记为答案时,该帖子很遗憾被删除了。我只是在重新说明答案。

调用invoke方法后由 ExecutorService 返回的Futures包含线程的所有Future对象。如果任何线程出现任何问题,则抛出java.util.concurrent.ExecutionException。当我们对Future做get()时,可以在拥有executorService的父线程中检测到哪个。然后e.getCause()捕获它后会得到导致错误/异常的实际对象。