带有invokeAll()的ExecutorService和java中的Future

带有invokeAll()的ExecutorService和java中的Future,java,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>> futu

手头有以下代码:

    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();
    }
ExecutorService executor=Executors.newFixedThreadPool(10);
集合集合=新的ArrayList();

对于(int n=1;n如果方法
future.get
返回,那么future完成的计算就完成了,因此调用
isDone
是多余的。是的,在所有future完成
ThreadPool
中的所有线程后,线程池中的所有线程都应该可用。

通常情况下,将可运行任务添加到线程池中。将线程添加到thread pool不会做你认为的事

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

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


我写它的方式是

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.
}
ExecutorService executor=Executors.newFixedThreadPool(10);
列表期货=新的ArrayList();
对于(int n=0;n<100;n++)
futures.add(executor.submit)(newmytask(n));
for(未来:未来){
布尔结果=future.get();
//对结果做点什么。
}

如果不需要结果来执行类型
Future
Future
或只是
Future
初始化一个值为1的变量检查,并更新else中的值。然后在执行循环后检查检查的值

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

要检查所有这些是否都是真的,可以执行以下操作:

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")
boolean works=true;
for(未来:未来){
future.get();
if(future.isDone()){
System.out.println(“真”);
}
否则{
System.out.println(“false”);works=false;
}
}
if(起作用)System.out.println(“是的,起作用”)

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

另一种方法是检查
ExecutorService
对象上的
awaittemination()
调用的返回值

  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!");
int计数器=0;
for(未来:未来)
{
future.get();
if(future.isDone())
System.out.println(“真”);
其他的
{
计数器++;
System.out.println(“假”);
}
}
如果(计数器!=0)
System.out.println(“完成!”);
//检查所有线程是否完成的另一种方法。
if(执行器等待终止(100,时间单位秒))
System.out.println(“完成!”);

意思是对瓦伊诺洛的回复发表评论,但我没有足够的信誉点:


isDone
也是多余的,因为
invokeAll
返回一个未来列表,其中
isDone
为true。javadocs。

调用此方法的invokeAll将等待完成所有take,然后CPU执行到达for循环以检查是否完成 或
我们是否需要执行..While循环检查任务的完成情况

如果不是我想的那样,我如何确保所有线程都完成了?您将任务添加到线程池,而不是线程,因为线程池已经有自己的线程。如果您将线程添加到线程池,它甚至不会
start()
MyTask,因为它需要可运行。因此您可以将其称为
MyTask
,并等待所有任务完成。您可以使用invokeAll()但我更喜欢边做边创建。有必要同时使用.get和.isDone吗?如果没有,哪一个对我的问题更好?@fen1kss get和isDone是不同的方法。所以问“哪一个对我的问题更好?”是毫无意义的。我想,你使用这些方法的方式似乎还可以。那么我可以删除这一部分吗?如果(future.isDone()){System.out.println(“true”);}else{System.out.println(“false”);}我想是的。for
Future
声明
get
“在必要时等待计算完成,然后检索其结果。”。因此,实际上您还需要将
isDone
包装到它自己的异常处理程序中。我认为这是最好的答案。为了澄清这一点,invokeAll在所有任务完成之前不会返回,即它是阻塞的。(存在非阻塞的重载)