CountDownLatch类的使用

java.util.concurrent.CountDownLatch是一个并发构造,它允许多个线程等候特定的操作完成。

CountDownLatch用一个数字初始化,通过调用countDown()方法来减低这个值。当一个线程调用await()方法后,它必须等候数值变成0以后才能往后继续执行。

调用await()方法会阻塞线程,直到这个数值变为0.

代码例子:

package com.dufeng.testjava.countdownlatch;

import java.util.concurrent.CountDownLatch;

public class TestCountDownLatch {
    
    public static void main(String[] args) {
        CountDownLatch latch = new CountDownLatch(3);
        
        Waiter waiter = new Waiter(latch);
        Decrementer decrementer = new Decrementer(latch);
        
        new Thread(waiter).start();
        new Thread(decrementer).start();
        
        System.out.println("end");
    }

}
package com.dufeng.testjava.countdownlatch;

import java.util.concurrent.CountDownLatch;

public class Waiter implements Runnable {
    
    private CountDownLatch latch;
    
    public Waiter(CountDownLatch latch) {
        this.latch = latch;
    }

    @Override
    public void run() {
        try {
            latch.await();
        } catch (InterruptedException e) {
            System.out.println(e.getMessage());
        }
        
        System.out.println("Waiter Released");
    }
}
package com.dufeng.testjava.countdownlatch;

import java.util.concurrent.CountDownLatch;

public class Decrementer implements Runnable {

    private CountDownLatch latch;
    
    public Decrementer(CountDownLatch latch) {
        this.latch = latch;
    }
    
    @Override
    public void run() {
        try {
            Thread.sleep(1000);
            latch.countDown();
            System.out.println(latch.getCount());
            
            Thread.sleep(1000);
            latch.countDown();
            System.out.println(latch.getCount());
            
            Thread.sleep(1000);
            latch.countDown();
            System.out.println(latch.getCount());
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

 

 执行结果:

end
2
1
0
Waiter Released

 

posted @ 2017-02-07 16:46  峰峰仔  阅读(326)  评论(0编辑  收藏  举报