Java ExecutorService—如何在其中一个线程内部发生异常后中断已从主线程调用的线程的执行

Java ExecutorService—如何在其中一个线程内部发生异常后中断已从主线程调用的线程的执行,java,multithreading,executorservice,Java,Multithreading,Executorservice,我有课程SomeService。它的方法可以从不同的线程调用(例如从RestController)。 此类包含ExecutorService和一些CustomClass public class SomeService { private ExecutorService service; private CustomClass customClass; public SomeService(ExecutorService service, CustomClass custom

我有课程
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();
   }
}
公共类服务{
私人遗嘱执行人服务;
私人定制类定制类;
公共服务(ExecutorService服务、CustomClass CustomClass){
服务=服务;
this.customClass=customClass;
}
公共服务邮政(){
CountDownLatch CountDownLatch=新的CountDownLatch(url.size());
for(字符串url:列出url){
服务提交(()->{
发送(url);
countdownlock.countDown();
});
}
倒计时闩锁。等待();
}
}
我想使用
ExecutorService
在不同的线程中并行执行
customClass.send(url)
,但此方法可以抛出
RuntimeException

例如,我提交了5项任务:
1.2个任务成功执行
2.2个任务正在运行。
3.其中一个抛出RuntimeException

如何中断正在运行的任务?

p.s。ExecutorService可以具有来自其他线程的任务。我不想打断他们

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

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

    });

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

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

    });

但如果executorService正在从另一个主线程执行任务,它会不会中断它们?例如,我需要在执行customClass.send(url)后保存url。当一些线程调用service.shutDown()时,可能会丢失有关执行的url信息。另一个线程可以执行customClass.send(url),并且在它的线程被中断之后,但是如果executorService正在从另一个主线程执行任务,它不会中断它们吗?例如,我需要在执行customClass.send(url)之后保存url。当一些线程调用service.shutDown()时,可能会丢失有关执行的url信息。另一个线程可以执行customClass.send(url),并且在其线程可能被中断之后