1. ホーム
  2. java

[解決済み】JavaマルチスレッドでCountDownLatchはどのように使用されるのですか?

2022-04-14 09:23:21

質問

誰かJavaを理解するのを手伝ってくれませんか? CountDownLatch は、どのような場合に使用するのでしょうか?

このプログラムがどのように動作するのか、あまり明確には分かっていません。私の理解では、3つのスレッドが一度に開始され、各スレッドは3000ms後にCountDownLatchを呼び出すと思われます。だから、カウントダウンは1つずつデクリメントします。ラッチがゼロになった後、プログラムは "Completed"をプリントします。もしかしたら、私が理解した方法は間違っているかもしれません。

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

class Processor implements Runnable {
    private CountDownLatch latch;

    public Processor(CountDownLatch latch) {
        this.latch = latch;
    }

    public void run() {
        System.out.println("Started.");

        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        latch.countDown();
    }
}

// -----------------------------------------------------

public class App {

    public static void main(String[] args) {

        CountDownLatch latch = new CountDownLatch(3); // coundown from 3 to 0

        ExecutorService executor = Executors.newFixedThreadPool(3); // 3 Threads in pool

        for(int i=0; i < 3; i++) {
            executor.submit(new Processor(latch)); // ref to latch. each time call new Processes latch will count down by 1
        }

        try {
            latch.await();  // wait until latch counted down to 0
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Completed.");
    }

}

解決方法は?

はい、正しく理解されました。 CountDownLatch はラッチの原理で動作し、メインスレッドはゲートが開くまで待機します。あるスレッドは n を作成する際に指定されたスレッド CountDownLatch .

を呼び出す任意のスレッド(通常はアプリケーションのメインスレッド)。 CountDownLatch.await() は、count がゼロになるか、他のスレッドに割り込まれるまで待ちます。他のすべてのスレッドは、カウントダウンするために CountDownLatch.countDown() が完了するか、準備が整えば

カウントがゼロになると、待機中のスレッドは続行します。の欠点/長所のひとつは CountDownLatch は再利用ができない。 CountDownLatch を追加しました。

編集する

使用方法 CountDownLatch あるスレッド (メインスレッドなど) が処理を続ける前に、1 つ以上のスレッドの完了を待つ必要がある場合。

を使用する古典的な例です。 CountDownLatch この場合、複数のサービスが複数のスレッドによって提供され、すべてのサービスが正常に開始されるまで、アプリケーションは処理を開始できません。

P.S. OPの質問にはかなりわかりやすい例があるので、1つも載せてません。