ExecutorService-如何在其中一个发生异常后中断从主线程调用的线程的执行

时间:2019-03-22 16:46:41

标签: java multithreading 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可以具有其他线程中的任务。我不想打扰他们。

1 个答案:

答案 0 :(得分:2)

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

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

    });