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()が true の場合、すべてのスレッドが完了していますか?
それらがすべて完了したことを確認するために、フラグを作成するにはどうすればよいですか?

4

7 に答える 7

20

vainolo の返信に対するコメントですが、十分な評判ポイントがありません。

isDoneinvokeAlltrueである先物のリストを返すため、これも冗長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

ブール変数を使用することは、すべてのスレッドが完了したことを理解する最も簡単な方法です。もう 1 つの方法は、整数などのプリミティブを使用することです。カウンターをインクリメント/デクリメントするだけで、すべてのスレッドが完了したかどうかを確認できます。

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 に答える
2

通常、実行可能なタスクをスレッド プールに追加します。スレッドプールにスレッドを追加しても、あなたが思うようにはなりません。

各タスクに対して 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 に答える
1

値 =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が返された場合、フューチャーによって行われた計算は終了しているため、呼び出しisDoneは冗長です。そして、はい、すべての先物が終了した後、 のすべてのスレッドが利用可能になるThreadPoolはずです。

于 2012-10-15T13:38:40.380 に答える
0

Invokeall このメソッドを呼び出すと、すべてが完了するまで待機し、CPU の実行が for ループに到達して完了を確認するか、または Do we need do .. While ループ タスクの完了を確認

于 2016-02-20T04:38:56.590 に答える