我正在使用Java中的ExecutorService和Callable。实现Callable的类在文件系统上执行一些IO工作。如果发生异常,我该如何停止可调用的执行并退出?退出Java 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停止例如如果IOException异常在foo1()发生,而不是让它继续foo2的();
编辑:此外,如果在foo1()中发生未检查的异常(如RuntimeException),则MyCallable也需要停止。
这就是会发生的事情。如果foo1抛出异常,call()方法将立即停止执行。是什么让你觉得它不会停止? –
从我原来的问题来看,这并不明显,但运行时异常也会冒泡并强制Callable停止? – tkja
当然可以。还有什么可能发生的?在使用并发之前,您应该真正了解异常的基本知识,这是一个非常非常复杂的问题。 –