`

CountDownLatch用法小结

 
阅读更多

       最近在看ZK的源码,看到了有用到java.util.concurrent.CountDownLatch 这个类。总结一下用法:

    CountDownLatch,一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。
主要方法
    public CountDownLatch(int count);
    public void countDown();
    public void await() throws InterruptedException
 
   构造方法参数指定了计数的次数
   countDown方法,当前线程调用此方法,则计数减1
   awaint方法,调用此方法会一直阻塞当前线程,直到计时器的值为0

 下面通过一个例子展示,程序会一直等待countDownLatch的值变成0,才会打印出:“工人们做完了。”。

package com.get.set;

import java.util.concurrent.CountDownLatch;

public class CountDownLatchDemo{
	
	public static void main(String args[]){
		CountDownLatch countDownLatch=new CountDownLatch(2);
		Worker workA=new Worker("wjy", countDownLatch);
		Worker workB=new Worker("yuanyuan", countDownLatch);
		
		workA.start();
		workB.start();
		
		try {
			countDownLatch.await();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		System.out.println("工人们做完了。");
	}
	
	static class Worker extends Thread{
		private String name;
		private CountDownLatch countDownLatch;
		public Worker(String name,CountDownLatch countDownLatch){
			this.name=name;
			this.countDownLatch=countDownLatch;
		}
		@Override
		public void run(){
			System.out.println("Hello, I am "+name);
			this.countDownLatch.countDown();
		}
	}
}
//运行结果:
Hello, I am wjy
Hello, I am yuanyuan
工人们做完了。

    注意:如果我们把CountDownLatch的初始值设为3,那么在上面这个程序中永远都不会打印出“工人们做完了。

   因为,程序会一直等待countDownLatch的值变成0.但是countDownLatch的值永远不可能变成0了。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics