gpt4 book ai didi

java - 一子线程抛出异常就返回主线程

转载 作者:搜寻专家 更新时间:2023-10-31 19:56:32 24 4
gpt4 key购买 nike

我正在使用 Executors.newCachedThreadPool()invokeAll 以及 Callable 列表来执行长时间运行的多线程处理。我的主线程被阻塞,直到所有线程都完成并且我可以处理 invokeAll 返回的 Futures。但是,如果其中一个 Callable 抛出异常并终止其他线程,我希望 invokeAll 立即返回。

使用 execute 而不是 invokeAll 会在第一个 future.get() 上阻塞,它不需要是抛出 execption 的那个.

使用忙等待循环遍历所有 futures 并检查 isDone() 似乎也不是最好的方法。

最佳答案

您可以使用更复杂的同步机制,如锁存器、屏障或信号量,但请查看 ExecutorCompletionService .它是 ExecutorService 的轻量级包装器,可让您监听第一个 完成的任务。这是一个简单的例子:

final ExecutorService executorService = Executors.newCachedThreadPool();
final ExecutorCompletionService<String> completionService =
new ExecutorCompletionService<String>(executorService);
for (int i = 0; i < 10; ++i) {
completionService.submit(new Task());
}
completionService.take().get();

代码非常简单。首先,用 completionService 包装 executorService。以后你用它来一个接一个地提交任务。最后一行很关键。它接受第一个完成的任务并尝试检索结果。如果它抛出异常,它将在这里重新抛出,用 ExecutionException 包裹:

try {
completionService.take().get();
} catch (ExecutionException e) {
e.getCause(); //this was thrown from task!
}

catch block 中,您可以以某种方式处理异常,例如取消剩余任务或关闭整个线程池。

当然,您可以通过调用 take() 十次来等待所有任务完成。只要至少有一项任务完成,每次调用都会阻塞。

关于java - 一子线程抛出异常就返回主线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14265034/

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