gpt4 book ai didi

java - 如果发生异常则退出 Java Callable

转载 作者:行者123 更新时间:2023-12-02 04:24:05 25 4
gpt4 key购买 nike

我正在 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;
}
}

这是示例执行服务类。它可以通过future对象来处理并行处理过程中出现的异常。

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
}
}
}

但是,如果 foo1() 中发生 IOException,我想立即让 MyCallable 停止,而不是让它继续 foo2();

编辑:此外,如果 foo1() 中发生未经检查的异常(例如 RuntimeException),MyCallable 也需要停止。

最佳答案

Callable<V>的签名的 call 方法是

V call() throws Exception

其描述为

Computes a result, or throws an exception if unable to do so.

换句话说,只是不要捕获 IOException 。如果你没有捕获它,那么执行就会停止,并且异常会向上传递一个级别。

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

正如您所知,Future.get方法将抛出 ExecutionException 如果Callable抛出异常。

关于java - 如果发生异常则退出 Java Callable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32405362/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com