从Callable.call()抛出的异常应该在哪里捕获?

13 浏览
0 Comments

从Callable.call()抛出的异常应该在哪里捕获?

可能重复:

处理Java ExecutorService任务的异常

我使用Java的ExecutorService来协调线程。

启动线程时,我使用以下代码:

pool = new ExecutorService(2);
callableResults = pool.invokeAll(threads);

为了收集结果,我使用future.get()来获取每个线程的结果。

"threads"是一个实现Callable并重写call()方法的类的对象列表。

现在我遇到了以下问题。方法call()会抛出各种特定的异常。invokeAll()future.get()只会抛出InterruptedException异常。

我在哪里可以捕获我在call()中抛出的特定异常?还是我必须在那里处理它们?如果抛出其中一种异常,结果是否为InterruptedException

0
0 Comments

在使用ExecutorService时,一个主要的问题是无法从Callable.call()中抛出的异常中捕获。这是因为ExecutorService的get()方法在等待任务执行完成时会阻塞,而且只有在任务抛出异常时才会抛出ExecutionException异常。

解决这个问题的方法是通过在调用Callable.call()方法时捕获异常,并将其封装到Future对象中。然后在调用Future.get()方法时,再次捕获ExecutionException异常,并通过Throwable.getCause()方法获取到实际的异常。

以下是一个示例代码,演示了如何捕获Callable.call()中抛出的异常:

ExecutorService executorService = Executors.newFixedThreadPool(1);
Future future = executorService.submit(() -> {
    // 在这里抛出一个异常
    throw new RuntimeException("Callable抛出的异常");
});
try {
    String result = future.get();
    System.out.println("结果:" + result);
} catch (ExecutionException e) {
    Throwable cause = e.getCause();
    System.out.println("捕获到异常:" + cause.getMessage());
}
executorService.shutdown();

在上面的代码中,Callable.call()方法抛出了一个RuntimeException异常。在调用Future.get()方法时,捕获到了ExecutionException异常,并通过getCause()方法获取到实际的异常。最后,打印出了异常的消息。

通过这种方式,我们可以在使用ExecutorService时捕获并处理Callable.call()中抛出的异常,避免了无法捕获异常的问题。

0