Java ThreadpoolExecutor,当其中一个运行线程引发异常时,等待其他运行线程完成

Java ThreadpoolExecutor,当其中一个运行线程引发异常时,等待其他运行线程完成,java,threadpoolexecutor,Java,Threadpoolexecutor,问题陈述:我在循环中使用ThreadPoolExecutor调用窗口进程(Abby)进行文本文件处理。一次有5个线程在运行,它们调用窗口进程。但在某些情况下,一个或多个正在运行的线程抛出异常。 在这种情况下,我希望允许其他正在运行的线程完成它们的任务,而引发异常的线程在运行的线程完成后会被优雅地处理我该怎么做? 到目前为止,我知道一旦发生异常,我们可以使用ThreadExecutionCompletionService和cancel其他正在运行的线程 但我的场景不同——我希望其他正在运行的线程完

问题陈述:我在循环中使用ThreadPoolExecutor调用窗口进程(Abby)进行文本文件处理。一次有5个线程在运行,它们调用窗口进程。但在某些情况下,一个或多个正在运行的线程抛出异常。 在这种情况下,我希望允许其他正在运行的线程完成它们的任务,而引发异常的线程在运行的线程完成后会被优雅地处理我该怎么做? 到目前为止,我知道一旦发生异常,我们可以使用ThreadExecutionCompletionServicecancel其他正在运行的线程 但我的场景不同——我希望其他正在运行的线程完成

ExecutorService executorService = Executors.newCachedThreadPool();
final ExecutorCompletionService<String> completionService = 
            new ExecutorCompletionService<String>(executorService);
for (int i = 0; i < 10; ++i) {
    completionService.submit(new Task());
}
ExecutorService ExecutorService=Executors.newCachedThreadPool();
最终执行者完成服务完成服务=
新的ExecutorCompletionService(executorService);
对于(int i=0;i<10;++i){
completionService.submit(新任务());
}
怎么样(注意,您必须根据自己的使用情况调整此选项)

ExecutorService ExecutorService=Executors.newCachedThreadPool();
列表期货=新的ArrayList();
对于(int i=0;i<10;++i){
futures.add(CompletableFuture.runAsync(
() -> {
//在这里工作,然后回来
复工
},执行者服务)
.例外情况(e->{
logger.error(“此处错误”+e);
返回null;
})
);
}
CompletableFuture.allOf(futures.toArray(新的CompletableFuture[futures.size())).join();

“优雅处理”是指“继续执行”还是什么?我在下面添加了一些过去对我有用的代码,解决了您遇到的问题。您必须对其进行调整,以适应您所寻找的内容,但它应该为您提供所需的基本知识,以感谢代码示例,但是我有一些限制,我必须在java 7而不是java 8中找到解决方案。“优雅”的意思是-我希望在退出主线程或处理异常之前,所有其他处于运行状态且未引发异常的线程都能成功完成。我已经找到了使用计数器和AtomicBoolean变量解决问题的替代方法
ExecutorService executorService = Executors.newCachedThreadPool();

List<CompletableFuture<Void>> futures = new ArrayList<>();
for (int i = 0; i < 10; ++i) {
    futures.add(CompletableFuture.runAsync(
                     () -> {
                         // do work here and return
                         return work
                      },executorService)
                      .exceptionally(e -> {
                           logger.error("Error here"+e);
                           return null;
                       })
      );
}
CompletableFutre.allOf(futures.toArray(new CompletableFuture[futures.size()])).join();