2015-11-21 7 views
10

同期プッシュ/ポップの要素であるConcurrentLinkedDequeを取得しました。 とI'vはスタックから1つの要素を取ります要素には隣人があります。スタックにプッシュしています。ExecutorService上で実行されているすべてのタスクが完了しているかどうかを確認する方法

例コード:

private ConcurrentLinkedDeque<Item> stack = new ConcurrentLinkedDeque<>(); 
private ExecutorService exec = Executors.newFixedThreadPool(5); 

    while ((item = stack.pollFirst()) != null) { 
       if (item == null) { 
       } else { 
        Runnable worker = new Solider(this, item); 
        exec.execute(worker); 
       } 
      } 

    class Solider{ 
     public void run(){ 
      if(item.hasNeighbors){ 
       for(Item item:item.neighbors){ 
        stack.push(item) 
       } 
      } 
     } 
    } 

私が質問に答えるwhileループ内に追加の文がしたい - 「キュータのいずれかのタスクが動作しています?」

答えて

24

ExecutorService.execute(Runnable)を使用すると、すべてのランナブルが完了しているかどうかを確認するきれいな方法はありません。 Runnable自体でそうするためのメカニズムを構築していない限り(これは私の意見ではうんざりです)。

代わりに
ExecutorService.submit(Runnable)を使用してください。このメソッドは、実行可能な結果のハンドルであるFuture<?>を返します。 Futuresを使用すると、結果を確認するきれいな方法が提供されます。

あなたがしなければならないのは、あなたが提出先物のリストを維持し、その後、あなたは先物とのいずれかのリスト全体を反復処理することが可能です。
    A)全ての先物がブロッキングで行われるのを待ちますまたは
    B)すべての先物がノンブロッキングで行われているかどうかを確認します。 < とにかく:私はこのために使用されるJavaのメソッドがすでにあります考え

List<Future<?>> futures = new ArrayList<Future<?>>(); 
ExecutorService exec = Executors.newFixedThreadPool(5); 

// Instead of using exec.execute() use exec.submit() 
// because it returns a monitorable future 
while((item = stack.pollFirst()) != null){ 
    Runnable worker = new Solider(this, item); 
    Future<?> f = exec.submit(worker); 
    futures.add(f); 
} 

// A) Await all runnables to be done (blocking) 
for(Future<?> future : futures) 
    future.get(); // get will block until the future is done 

// B) Check if all runnables are done (non-blocking) 
boolean allDone = true; 
for(Future<?> future : futures){ 
    allDone &= future.isDone(); // check if future is done 
} 
+0

は、ここでのコード例です!私はあなたのソリューションを使用して、それは良い作品です、ありがとう! :) – user4129715

+0

ここでallDoneの目的は何でしょうか?future.isDoneはtrueかfalseを返しますか?ところで、偉大な答え! – User3

+1

@ User3 'allDone'の目的は、('&= '演算子を使って)未来の_all_が完了したかどうかを示す単一のブール値を取得することです。 'future.isDone()'は個々の未来が完了したかどうかを調べるためだけに使うことができます –

関連する問題