java - 仅当所有线程都抛出异常时如何关闭java执行程序服务
问题描述
我在 java 应用程序中使用下面的代码。它产生 3 个工作线程。我需要的是,如果一个线程失败(从运行中抛出未处理的异常),其他线程应该继续执行。如果我调用 executor.shutdown() 如下所示,它将终止其他线程(不接受新任务)。我想的一个选项是在 ExecutionException catch 块上有一个计数器并仅在 counter== 时调用 shutdown消费者人数。有一个更好的方法吗?
public void execute() {
int numConsumers = Integer.parseInt(configs.getSINK_NUMBER_OF_CONSUMERs());
Future<?> future=null;
log.info("Creating {} consumers",numConsumers);
List<String> topics = Arrays.asList(configs.getTOPIC_NAME());
ExecutorService executor = Executors.newFixedThreadPool(numConsumers);
final List<SinkConsumer> consumers = new ArrayList<>();
for (int i = 0; i < numConsumers; i++) {
consumer = new SinkConsumer(UUID.randomUUID().toString(),topics,configs);
consumers.add(consumer);
future = executor.submit(consumer);
}
try {
future.get();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} catch (ExecutionException e) {
executor.shutdown();
}
}
解决方案
推荐阅读
- reactjs - 微软会放弃 Office 插件吗?
- python - 写入文件时的并行处理
- windows - 在 Windows gitlab 运行器上的 gitlab-ci 中使用外部 git-lfs 服务器?
- mysql - 如何在 MYSQL 中保存变体信息
- python - 如何获取 Zoom 会议的参与者信息?
- flutter - 在 Future Async 而不是 Streams 上运行的 geoflutter fire?
- mysql - 用户的mysql自定义镜像和Minikube的奇怪行为
- c - 错误的 ELF 类:ELFCLASS64 即使在编译时设置了 -m32 标志?
- html - 你如何在下拉列表中删除包装填充?
- python - 如何加快熊猫数据帧上的循环