簡體   English   中英

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

[英]ExecutorService with invokeAll() and Future in 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()都為true,那么所有線程都已完成了嗎?
我怎樣才能制作旗幟,以確保所有這些都完成了?

作為對vainolo回復的評論,但我沒有足夠的聲望點:

isDone也是多余的,因為invokeAll返回isDone為true的期貨列表。 javadocs 提到了這一點

要檢查是否所有都是真的,您可以執行以下操作:

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")

通常,您將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

使用布爾變量是理解所有線程完成的最簡單方法。 另一種方式可以是使用基元,例如整數。 您可以簡單地遞增/遞減計數器以查看是否所有線程都已完成。

另一種方法是檢查ExecutorService對象上awaitTermination()調用的返回值。

  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!");

初始化一個值為1的變量檢查並更新else中的值。然后在循環執行后檢查check的值

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

如果方法future.get返回,那么未來完成的計算就完成了,因此調用isDone是多余的。 是的,在完成所有期貨之后, ThreadPool中的所有ThreadPool都應該可用。

Invokeall調用此方法等待完成所有采取然后CPU執行到達for循環檢查完成或我們需要做.. while循環檢查任務完成

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM