首页 > 解决方案 > 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 可以有来自其他线程的任务。我不想打扰他们。

标签: javamultithreadingexecutorservice

解决方案


您可以shutdownNow()在捕获异常时调用执行器服务,也需要Thread#interrupted()在处理之前检查任务内部。您的代码应如下所示:

service.submit(() -> {
        if (!Thread.interrupted()) {
            try {
                  customClass.send(url);
                  countDownLatch.countDown();
                } catch (Exception e) {
                   service.shutdownNow();
                }
        }

    });

推荐阅读