从Callable.call()抛出的异常应该在哪里捕获?
从Callable.call()抛出的异常应该在哪里捕获?
可能重复:
我使用Java的ExecutorService
来协调线程。
启动线程时,我使用以下代码:
pool = new ExecutorService(2); callableResults = pool.invokeAll(threads);
为了收集结果,我使用future.get()
来获取每个线程的结果。
"threads"是一个实现Callable
并重写call()
方法的类的对象列表。
现在我遇到了以下问题。方法call()
会抛出各种特定的异常。invokeAll()
和future.get()
只会抛出InterruptedException
异常。
我在哪里可以捕获我在call()
中抛出的特定异常?还是我必须在那里处理它们?如果抛出其中一种异常,结果是否为InterruptedException
?
在使用ExecutorService时,一个主要的问题是无法从Callable.call()中抛出的异常中捕获。这是因为ExecutorService的get()方法在等待任务执行完成时会阻塞,而且只有在任务抛出异常时才会抛出ExecutionException异常。
解决这个问题的方法是通过在调用Callable.call()方法时捕获异常,并将其封装到Future对象中。然后在调用Future.get()方法时,再次捕获ExecutionException异常,并通过Throwable.getCause()方法获取到实际的异常。
以下是一个示例代码,演示了如何捕获Callable.call()中抛出的异常:
ExecutorService executorService = Executors.newFixedThreadPool(1); Futurefuture = 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()中抛出的异常,避免了无法捕获异常的问题。