在java中使用invokeAll()和Future的ExecutorService

时间:2012-10-15 13:35:12

标签: java

手头有以下代码:

    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()都为真,那么所有线程都已完成? 我怎样才能制作旗帜,以确保所有这些都已完成?

7 个答案:

答案 0 :(得分:18)

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

isDone也是多余的,因为invokeAll会返回isDone为真的期货列表。 javadocs mention this

答案 1 :(得分: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")

答案 2 :(得分: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

类型

答案 3 :(得分: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!");

答案 4 :(得分:1)

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

       if (future.isDone()) {
             System.out.println("true");
        }
        else
            {System.out.println("false");
             check=0;}

答案 5 :(得分:0)

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

答案 6 :(得分:0)

Invokeall调用此方法等待完成所有接受然后CPU执行到达for循环以检查完成 要么 我们需要吗... while循环检查任务完成