如果发生异常,则退出Java Callable

时间:2015-09-04 19:36:02

标签: java multithreading executorservice

我在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也需要停止。

1 个答案:

答案 0 :(得分:2)

Callable<V>&#39; call方法的签名是

V call() throws Exception

及其描述

  

计算结果,如果无法执行,则抛出异常。

换句话说,就是不要抓住IOException。如果你没有抓住它,那么执行就会停止,异常会在一个级别上传递。

注意:这仅适用于非RuntimeExceptions,如果该方法被标记为抛出异常类型,call被标记为正在执行,因为它被声明为throws Exception

正如您已经知道的那样,如果Future引发异常,.get的{​​{1}}方法会抛出ExecutionException