37

他のスレッドが終了するのを待つときは、 または のいずれかを使用できjoinますCountdownLatch。これら 2 つのメカニズムのいずれかを使用することの長所と短所は何ですか?

4

5 に答える 5

32

Thread.join自分でスレッドを処理している場合にのみ使用できます。ほとんどの人は、スレッド処理の詳細を直接処理しないことを選択し、代わりに を使用しExecutorServiceて処理します。ExecutorServices はタスクの実行方法を直接明らかにしないため、 :を使用する必要があります (つまり、サービス全体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();
于 2012-09-03T22:46:09.200 に答える
20

もう 1 つの違いは、後で、結合されたスレッドがjoin()実行を終了した場合にのみスレッドのブロックを解除できることです。一方CountDownLatch、スレッド内では、スレッドの完了時またはその間に条件に基づいていつでもカウントを減らすことができます。
このようにして、結合されたスレッドの完了のみに依存するのではなく、スレッドのブロック解除をより適切に制御できます。

于 2016-11-02T18:58:55.720 に答える
8

CountdownLatchはタスク指向であり、スレッドに依存しません。無関係なタスクのセット全体をthreadPoolに送信でき、CountdownLatchにより、各セットがオリジネーターに完了を通知します。Join()は、タスクをスレッドにリンクする厄介な異常行為であり、簡単に言えば、そもそも言語を入力するべきではありませんでした。悲しいことに、スレッドチュートリアルの大規模な山は、最初のページでJoin()に言及しているため、デッドロックジェネレータとして初心者にスレッドを紹介し、スレッドファンクを生成します:(

于 2012-09-03T23:43:11.023 に答える
4

CountdownLatchスレッドを直接使用する代わりに、Executor サービスにサブミットするように Item の実装を変更できます。

このCountDownLatchクラスにより、スレッドの開始と停止を調整できます。一般的な用途は次のとおりです。

  1. 複数のスレッドを同時に開始することができます。
  2. 複数のスレッドが終了するのを待つことができます (たとえば、このThread.join() メソッドでは 1 つのスレッドしか待つことができません)。

これを見ることができます-> http://javahowto.blogspot.com/2011/08/when-to-join-threads-with.html

そしてこれ - > CountDownLatch のlatch.await() メソッドと Thread.join()

于 2012-09-03T22:51:10.863 に答える