2011-07-04 10 views
1

可能性の重複:
How to wait for a set of threads to complete?スレッドは、すべてのスレッドがjavaを使用して出力を返すまで待機しますか?

私は3つのスレッドを実行したい、各スレッドは、異なるクラスを呼び出します。これらのクラスは何らかの処理を行い、Booleanの値を返します.3つのスレッドがすべて出力を返すまで待ち​​ます。 Javaを使用してこれを実装する方法を知りたい。

おかげ

答えて

4

あなたはそれを行うためにThread.join()を使用することができます:あなたのソリューションのために

Thread[] threads = new Thread[numOfThreads]; 
for (int i = 0; i < threads.length; i++) { 
    threads[i] = new Thread(new Runnable() { 
     public void run() { 
      System.out.println("xxx"); 
     } 
    }); 
    threads[i].start(); 
} 

for (int i = 0; i < threads.length; i++) { 
    try { 
     threads[i].join(); 
    } catch (InterruptedException e) { 
    } 
} 

Thread[] threads = new Thread[3]; 
threads[i] = new Thread(new Runnable() { 
     ... 
}).start(); 
threads[i] = new Thread(new Runnable() { 
     ... 
}).start(); 
threads[i] = new Thread(new Runnable() { 
     ... 
}).start(); 

for (int i = 0; i < threads.length; i++) { 
    try { 
     threads[i].join(); 
    } catch (InterruptedException e) { 
    } 
} 
0

あなたは "バリア" を使用することができます(Java APIの実装のためCyclicBarrierを参照)を参照してください。また、出力を取得するだけで出力を処理する前にすべてを終了する必要がない場合は、Futureを使用して計算を表すことができ、結果を取得するときに必要に応じてブロックされます。

0

次のようThread.join()を使用することができます: -

Thread t1 = new Thread(myRunnable1); 
Thread t2 = new Thread(myRunnable2); 
Thread t3 = new Thread(myRunnable3); 

t1.start(); 
t2.start(); 
t3.start(); 

t1.join(); 
t2.join(); 
t3.join(); 

//do something when all 3 threads finish 

私は、これはあなたの条件を達成するために役立つことを願っています。

ありがとう、

Charlee Ch。

2

あなたがExecutorServiceのを使用している場合は、

ExecutorService es = /* create a reusable thread pool */ 

List<Future> futures = new ArrayList<Future>(); 
futures.add(es.submit(myRunnable1)); 
futures.add(es.submit(myRunnable2)); 
futures.add(es.submit(myRunnable3)); 
for(Future f: futures) f.get(); // wait for them to finish. 

を行うことができますが、ブール値を返すようにしたい場合は、代わりに呼び出し可能を使用する必要があります。またinvokeAll

ExecutorService es = /* create a reusable thread pool */ 

List<Future<Boolean>> futures = new ArrayList<Future<Boolean>>(); 
es.invokeAll(Arrays.asList(
    new Callable<Boolean>() { 
     public Boolean call() { 
      return true; 
     } 
    }, 
    new Callable<Boolean>() { 
     public Boolean call() { 
      return false; 
     } 
    }, 
    new Callable<Boolean>() { 
     public Boolean call() { 
      return true; 
     } 
    } 
)); 

for(Future<Boolean> f: futures) { 
     Boolean result = f.get(); 
} 
+1

1に例を見てみたが、' invokeAll'は、より良い賭けかもしれませんしてください。 – Qwerky

+0

私はそれを考えましたが、invokeAllはCallableのコレクションを取ります。 ;) –

+0

実際にCallableは、ブール値を返すことを望んでいるため、呼び出される可能性のあるものです。私はinvokeAll()を2番目に使用します。 RunnableをラップするExecutors.callable()は常に存在します。 – sjlee

関連する問題