CountDownLatch使用

1591 ワード

java.util.concurrent.CountDownLatchは、1つまたは複数のスレッドが所定の操作のセットが完了するのを待つことを可能にする同時構造です.CountDownLatchは所定のカウントで初期化される.カウントはcountDown()メソッドを呼び出すことによって減少します.このカウントがゼロに達するのを待つスレッドはawait()メソッドの1つを呼び出すことができます.await()を呼び出すと、カウントがゼロになるまでスレッドがブロックされます.
次は簡単な例です.DecrementerがCountDownLatchでcountDown()を3回呼び出した後、待機していたWaiterはawait()呼び出しから解放されます.
CountDownLatch latch = new CountDownLatch(3);

Waiter      waiter      = new Waiter(latch);
Decrementer decrementer = new Decrementer(latch);

new Thread(waiter)     .start();
new Thread(decrementer).start();
Thread.sleep(4000);
public class Waiter implements Runnable{

    CountDownLatch latch = null;

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

    public void run() {
        try {
            latch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.println("Waiter Released");
    }
}
public class Decrementer implements Runnable {

    CountDownLatch latch = null;

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

    public void run() {

        try {
            Thread.sleep(1000);
            this.latch.countDown();

            Thread.sleep(1000);
            this.latch.countDown();

            Thread.sleep(1000);
            this.latch.countDown();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

(原文)(http://tutorials.jenkov.com/java-util-concurrent/countdownlatch.html)