如何知道提交给执行人的任务是否引发异常?

时间:2013-03-01 15:05:19

标签: java multithreading executorservice executor

如果我在ExecutorService中运行一个线程,有没有办法知道这个线程在开始执行时没有抛出异常?

4 个答案:

答案 0 :(得分:5)

根据the JavaDoc,您可以使用submit()

提交您的runnable执行者
    ExecutorService service = Executors.newSingleThreadExecutor();
    Future f = service.submit(new Runnable() {
        @Override
        public void run() {
            throw new RuntimeException("I failed for no reason");
        }
    });
    try {
        f.get();            
    } catch (ExecutionException ee) {
        System.out.println("Execution failed " + ee.getMessage());
    } catch (InterruptedException ie) {
        System.out.println("Execution failed " + ie.getMessage());
    }

此方法仅在取消选中例外时才有效。如果您检查了例外情况,请将其重新包装在RuntimeException中,或使用Callable代替Runnable界面。

答案 1 :(得分:2)

ExecutorService executor = Executors.newFixedThreadPool (4);

Future <?> future = executor.submit (new Runnable ()
{
    @Override
    public void run () {
        // while (true);
        throw new RuntimeException ("Something bad happend!");
    }
});

Thread.sleep (1000L);

try
{
    future.get (0, TimeUnit.MILLISECONDS);
}
catch (TimeoutException ex)
{
    System.out.println ("No exceptions");
}
catch (ExecutionException ex)
{
    System.out.println ("Exception happend: " + ex.getCause ());
}

答案 2 :(得分:0)

在您的另一个问题中说明这一点:使用您自己的ThreadPoolExecutor代替Executors中预先出炉的afterExecute。然后覆盖TPE提供的{{1}}挂钩,以便在例外情况下执行任何操作。

答案 3 :(得分:0)

如果正在执行任务的线程中存在异常,则get()的{​​p Future方法会抛出ExecutionException。包含在此异常中的实际异常。