我在Java中使用ExecutorService和Callable。实现Callable的类在文件系统上执行一些IO工作。如果发生异常,如何停止执行可调用并退出?
这是一个实现Callable的示例类,它有两个方法,foo1()和foo2()
public class MyCallable<Object> implements Callable<Object> {
public Object call() throws IOException, SQLException {
// method 1 , could throw IOException
foo1();
// method 2 , could throw SQLException
foo2();
return null;
}
}
这是示例执行服务类。它可以处理通过期货对象进行并行处理期间发生的异常。
public class MyExecutorService {
ExecutorService listProcessor;
listProcessor = Executors.newFixedThreadPool(2);
List<Callable<Object>> callableTodo = new ArrayList<Callable<Object>>();
// add the callables to the todo list
callableTodo.add(new MyCallable<Object>());
callableTodo.add(new MyCallable<Object>());
// start the threads
List<Future<Object>> futures = listProcessor.invokeAll(callableTodo);
listProcessor.shutdown();
listProcessor.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
// futures now holds possible exceptions
for (Future<Object> future : futures) {
try {
future.get();
} catch (ExecutionException e) {
// process the exception
}
}
}
但是我想立即让MyCallable停止,例如在foo1()中发生IOException,而不是让它继续使用foo2();
编辑:此外,如果在foo1()中发生未经检查的异常(如RuntimeException),MyCallable也需要停止。
答案 0 :(得分:2)
Callable<V>
&#39; call
方法的签名是
V call() throws Exception
及其描述
计算结果,如果无法执行,则抛出异常。
换句话说,就是不要抓住IOException
。如果你没有抓住它,那么执行就会停止,异常会在一个级别上传递。
注意:这仅适用于非RuntimeExceptions,如果该方法被标记为抛出异常类型,call
被标记为正在执行,因为它被声明为throws Exception
。
正如您已经知道的那样,如果Future
引发异常,.get
的{{1}}方法会抛出ExecutionException
。