他のスレッドが終了するのを待つときは、 または のいずれかを使用できjoin
ますCountdownLatch
。これら 2 つのメカニズムのいずれかを使用することの長所と短所は何ですか?
5 に答える
Thread.join
自分でスレッドを処理している場合にのみ使用できます。ほとんどの人は、スレッド処理の詳細を直接処理しないことを選択し、代わりに を使用しExecutorService
て処理します。ExecutorService
s はタスクの実行方法を直接明らかにしないため、 :を使用する必要があります (つまり、サービス全体CountDownLatch
だけを使用したくない場合)。shutdown
ExecutorService service = Executors.newFixedThreadPool(5);
final CountDownLatch latch = new CountDownLatch(5);
for(int x = 0; x < 5; x++) {
service.submit(new Runnable() {
public void run() {
// do something
latch.countDown();
}
});
}
latch.await();
もう 1 つの違いは、後で、結合されたスレッドがjoin()
実行を終了した場合にのみスレッドのブロックを解除できることです。一方CountDownLatch
、スレッド内では、スレッドの完了時またはその間に条件に基づいていつでもカウントを減らすことができます。
このようにして、結合されたスレッドの完了のみに依存するのではなく、スレッドのブロック解除をより適切に制御できます。
CountdownLatchはタスク指向であり、スレッドに依存しません。無関係なタスクのセット全体をthreadPoolに送信でき、CountdownLatchにより、各セットがオリジネーターに完了を通知します。Join()は、タスクをスレッドにリンクする厄介な異常行為であり、簡単に言えば、そもそも言語を入力するべきではありませんでした。悲しいことに、スレッドチュートリアルの大規模な山は、最初のページでJoin()に言及しているため、デッドロックジェネレータとして初心者にスレッドを紹介し、スレッドファンクを生成します:(
CountdownLatch
スレッドを直接使用する代わりに、Executor サービスにサブミットするように Item の実装を変更できます。
このCountDownLatch
クラスにより、スレッドの開始と停止を調整できます。一般的な用途は次のとおりです。
- 複数のスレッドを同時に開始することができます。
- 複数のスレッドが終了するのを待つことができます (たとえば、この
Thread.join()
メソッドでは 1 つのスレッドしか待つことができません)。
これを見ることができます-> http://javahowto.blogspot.com/2011/08/when-to-join-threads-with.html