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

fen*_*sss 9 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();
    }
Run Code Online (Sandbox Code Playgroud)

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

use*_*408 18

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

isDone也是多余的,因为invokeAll返回一个isDone真实的期货清单.javadocs 提到了这一点.

  • 在我看来,这是最好的答案.为了澄清,invokeAll在完成所有任务之前不会返回,也就是说它是阻塞的.(存在无阻塞的重载) (2认同)

gab*_*jan 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")
Run Code Online (Sandbox Code Playgroud)