java - 如何取消ExecutorService中的所有线程/线程?

标签 java

我编写了以下多线程程序。如果线程之一发回 false 作为返回,我想取消所有线程。但是,尽管我通过取消单个任务来取消线程。它不工作。我需要做哪些更改才能取消线程?

我编写了以下多线程程序。如果线程之一发回 false 作为返回,我想取消所有线程。但是,尽管我通过取消单个任务来取消线程。它不工作。我需要做哪些更改才能取消线程?

import java.util.Iterator;
 import java.util.List;
 import java.util.concurrent.Callable;

public class BeamWorkerThread implements Callable<Boolean> {


  private List<BeamData> beamData;
  private String threadId;



 public BeamScallopingWorkerThread(
    List<BeamData> beamData, String threadId) {
   super();
   this.beamData = beamData;
   this.threadId = threadId;
  }





 @Override
  public Boolean call() throws Exception {

  Boolean result = true;

  DataValidator validator = new DataValidator();
   Iterator<BeamScallopingData> it = beamData.iterator();

  BeamData data = null;
  while(it.hasNext()){

   data = it.next();

   if(!validator.validateDensity(data.getBin_ll_lat(), data.getBin_ll_lon(), data.getBin_ur_lat(), data.getBin_ur_lon())){
     result = false;
     break;
    }
   }
   return result;
  }

}









   ExecutorService threadPool = Executors.newFixedThreadPool(100);
        List<Future<Boolean>> results = new ArrayList<Future<Boolean>>();

        long count = 0;
         final long RowLimt = 10000;
         long threadCount = 1;

        while ((beamData = csvReader.read(
           BeamData.class, headers1, processors)) != null) {

         if (count == 0) {
           beamDataList = new ArrayList<BeamData>();
          }

         beamDataList.add(beamData);
          count++;
          if (count == RowLimt) {
           results.add(threadPool
             .submit(new BeamWorkerThread(
               beamDataList, "thread:"
                 + (threadCount++))));
           count = 0;
          }
         }

        results.add(threadPool.submit(new BeamWorkerThread(
           beamDataList, "thread:" + (threadCount++))));
         System.out.println("Number of threads" + threadCount);
         for (Future<Boolean> fs : results)
          try {


           if(fs.get() == false){
            System.out.println("Thread is false");
            for(Future<Boolean> fs1 : results){
             fs1.cancel(true);
            }
           }
          } catch(CancellationException e){

         } catch (InterruptedException e) {

         } catch (ExecutionException e) {

         } finally {
           threadPool.shutdownNow();
          }

       }

我的评论

感谢大家的投入,我对回复感到不知所措。我确实知道,实现良好的线程会使应用程序达到顶峰,同时如果实现不当则会使应用程序崩溃。我同意我有奇思妙想,但我没有其他选择。我有超过 1000 万条记录,因此我会有内存限制和时间限制。我需要同时解决这两个问题。因此,我不是吞下整个数据,而是将其分成 block ,而且如果一个数据无效,我不想浪费时间处理剩余的百万数据。我发现@Mark Peters 建议是一个选项。相应地进行了更改我的意思是添加标志来中断任务并且我很困惑 future 列表的工作方式。我的理解是,一旦所有线程返回其值,就会开始循环遍历 future 列表的每个字段。在那种情况下,无法从主列表中途取消所有任务。我需要将对象的引用传递给每个线程。如果一个线程使用线程引用发现无效数据,则调用每个线程的取消方法来设置中断标志。

while(it.hasNext() && !cancelled) {
         if(!validate){
               // loop through each thread reference and call Cancel method
         }
      }

最佳答案

无论您尝试取消所有剩余任务,如果您的代码没有仔细编写为可中断,它都将失败。确切地说,这不仅仅是一个 StackOverflow 答案。一些准则:

  • 不要吞下InterruptedException。使其发生中断任务;
  • 如果您的代码在可中断方法中花费的时间不多,则必须插入显式的 Thread.interrupted() 检查并做出适当的 react 。

编写可中断代码通常不是初学者的东西,所以要小心。

关于java - 如何取消ExecutorService中的所有线程/线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18216886/

相关文章:

java - 如何在java中进行分栏

java - 我的应用程序在执行 Intent 语句时崩溃

java - setFirstResult 和 setMaxResults 没有按预期工作

java - 谁能告诉我为什么它的计算结果为 0?

java - 无法下载 scala-library-2.11

java - Android kotlin - 取消画廊选择时应用程序停止工作

java.lang.ClassNotFoundException : org. springframework.servlet.DispatcherServlet

java - 我的循环出了什么问题?不断收到 NoSuchElementException

java - 如何使 GML/JTS Geometry 在 Java 中有效?

java - Spring 3.1 Autowiring 具有多个泛型参数的泛型类