java - ExecutorService - 如何在其中一个发生异常后中断已从主线程调用的线程的执行
问题描述
我有课SomeService
。可以从不同的线程(例如从 RestController)调用它的方法。此类包含ExecutorService
和一些CustomClass
.
public class SomeService {
private ExecutorService service;
private CustomClass customClass;
public SomeService(ExecutorService service, CustomClass customClass){
this.service = service;
this.customClass = customClass;
}
public void servicePost() {
CountDownLatch countDownLatch = new CountDownLatch(urls.size());
for (String url : List<String> urls){
service.submit(() -> {
customClass.send(url);
countDownLatch.countDown();
});
}
countDownLatch.await();
}
}
我想customClass.send(url)
在不同的线程中并行执行,ExecutorService
但是这个方法可以抛出RuntimeException
.
比如我提交了5个任务:
1. 2个任务执行成功
2. 2个任务正在运行。
3. 其中一个抛出RuntimeException。
如何中断正在运行的任务?
附言。ExecutorService 可以有来自其他线程的任务。我不想打扰他们。
解决方案
您可以shutdownNow()
在捕获异常时调用执行器服务,也需要Thread#interrupted()
在处理之前检查任务内部。您的代码应如下所示:
service.submit(() -> {
if (!Thread.interrupted()) {
try {
customClass.send(url);
countDownLatch.countDown();
} catch (Exception e) {
service.shutdownNow();
}
}
});
推荐阅读
- python-3.x - 部署到 AWS Lambda 的 Python 包包含父文件夹名称
- android - Firebase 不插入数据
- java - Android (java): OnBackPress() 在尝试从 Activity 返回到片段时关闭我的应用程序
- excel-formula - 一个计算与excel中其他列相关的列的总和的函数
- rust - 如何在 Rust 中将 Vec<&String> 转换为 &[&str]
- rabbitmq - RabbitMQ 队列在使用中过期
- java - 如何仅使用按位运算符添加或减去由 char[] 数组表示的两个二进制数
- java - Maven 设置 xml 中服务器凭据的最佳实践
- vhdl - 输出控制不会取任何值 => UUU
- python - 如何从特定接口的 Open API 文件中提取 JSON 模式?