9

手头有以下代码:

    ExecutorService executor = Executors.newFixedThreadPool(10);
    Collection collection = new ArrayList();
    for (int n=1; n<100; n++)
        collection.add(new MyThread(n));

    try {
        List<Future<Boolean>> futures = executor.invokeAll(collection);

        for(Future<Boolean> future : futures){
            future.get();
            if (future.isDone()) {
                System.out.println("true");
            }
            else
                System.out.println("false");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

如果以上是正确的?
如果一切future.isDone()都是真的,那么所有的线程都已经完成了吗?
我怎样才能制作一面旗帜,以确保所有这些都完成了?

4

7 回答 7

20

作为对vainolo回复的评论,但我没有足够的声誉点:

isDone也是多余的,因为invokeAll返回一个isDone为真的期货列表。javadocs提到了这一点

于 2014-02-05T13:01:51.917 回答
7

要检查所有内容是否正确,您可以执行以下操作:

boolean works=true;
  for(Future<Boolean> future : futures){
        future.get();
        if (future.isDone()) {
            System.out.println("true");
        }
        else{
            System.out.println("false");works=false;
        }
    }
if(works)System.out.println("yea it works")
于 2012-10-15T13:39:00.530 回答
2

通常,您将 Runnable 任务添加到线程池。将线程添加到线程池不会按照您的想法进行。

当 future.get() 为每个任务返回时,所有任务都已完成。运行任务的线程仍将运行。

如果您想在任务完成后停止所有线程,您可以使用executor.shutdown();executor.awaitTermination


我会写它的方式是

ExecutorService executor = Executors.newFixedThreadPool(10);
List<Future<Boolean>> futures = new ArrayList<>();
for (int n = 0; n < 100; n++)
    futures .add(executor.submit(new MyTask(n));

for(Future<Boolean> future : futures) {
    boolean result = future.get();
    // do something with the result.
}

如果你不需要结果来输入Future<Void>Future<?>或只是Future

于 2012-10-15T13:38:40.887 回答
2

使用布尔变量是了解所有线程都已完成的最简单方法。另一种方式可以是使用原语,例如整数。您可以简单地增加/减少计数器以查看是否所有线程都已完成。

另一种方法可能是检查对象awaitTermination()调用的返回值。ExecutorService

  int counter = 0;

  for(Future<Boolean> future : futures)
  {
        future.get();            
        if (future.isDone())
            System.out.println("true");
        else
        {
            counter++;
            System.out.println("false");
        }
   }

   if(counter != 0)
       System.out.println("DONE!");

   // Another way of checking all threads are done.
   if(executor.awaitTermination(100, TimeUnit.SECONDS))
       System.out.println("DONE!");
于 2012-10-15T13:46:17.907 回答
1

使用 value =1 初始化变量 check 并更新 else 中的值。然后在循环执行后检查 check 的值

       if (future.isDone()) {
             System.out.println("true");
        }
        else
            {System.out.println("false");
             check=0;}
于 2012-10-15T13:38:51.370 回答
0

如果方法future.get返回,那么future完成的计算就完成了,所以调用isDone是多余的。是的,在所有期货都完成之后,ThreadPool应该可以使用所有线程。

于 2012-10-15T13:38:40.380 回答
0

Invokeall 调用此方法等待完成所有获取然后 CPU 执行到达 for 循环以检查是否完成或者我们需要 do .. While 循环来检查任务的完成

于 2016-02-20T04:38:56.590 回答