2015-09-04 33 views
0

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

+2

这就是会发生的事情。如果foo1抛出异常,call()方法将立即停止执行。是什么让你觉得它不会停止? –

+0

从我原来的问题来看,这并不明显,但运行时异常也会冒泡并强制Callable停止? – tkja

+0

当然可以。还有什么可能发生的?在使用并发之前,您应该真正了解异常的基本知识,这是一个非常非常复杂的问题。 –

回答

2

Callable<V>call方法的签名是

V call() throws Exception

及其描述是

计算结果,或抛出异常,如果不能这样做。

换句话说,只是不赶上IOException。如果你没有抓住它,那么执行停止,并且异常通过一个级别。

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

如您所知,Future.get方法将在Callable引发异常时抛出ExecutionException

相关问题