![](/img/trans.png)
[英]Java: ExecutorService with Callables: invokeAll() and future.get() - results in correct order?
[英]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.