多线程中的CountDownLatch闭锁(倒计时锁)学习和用例

多线程中的CountDownLatch闭锁(倒计时锁)学习和用例

1.CountDownLatch的构造方法接收一个int的参数作为计数器,如果你想等待N个点,这里传入N.
2.当我们调用countDown()方法时,N就会减一,await()方法会阻塞线程,直到N变为0,所以N可以是N个线程,也可以是N个执行步骤,用在多个线程时,只需要把CountDownLatch的引用传递给线程即可。

总结一句话:相当于老师要上课,必须所有的同学都到齐了才能开始,差一个也不行,班级里每次来一个学生就调用countDown()方法一次,也就是N减一,直到N变为0时开始上课。

废话不多说,直接上代码

package java中的并发工具类;

import java.util.concurrent.CountDownLatch;

public class CountDownLatchTest {
	
	static CountDownLatch c = new CountDownLatch(3); 

	public static void main(String[] args) throws InterruptedException {
		
		Thread t1 = new Thread(new Runnable() {		
			@Override
			public void run() {
				for (int i = 0; i < 30; i++) {
					System.out.println("t1执行第"+i+"个!");
				}
				System.out.println("t1执行完毕。");
				c.countDown();
			}
		});
		Thread t2 = new Thread(new Runnable() {		
			@Override
			public void run() {
				for (int i = 0; i < 60; i++) {
					System.out.println("t2执行第"+i+"个!");
				}
				System.out.println("t2执行完毕。");
				c.countDown();
			}
		});
		Thread t3 = new Thread(new Runnable() {		
			@Override
			public void run() {
				for (int i = 0; i < 90; i++) {
					System.out.println("t3执行第"+i+"个!");
				}
				System.out.println("t3执行完毕。");
				c.countDown();
			}
		});
		System.out.println("t1,t2,t3开始。。。");
		t1.start();t2.start();t3.start();
		long time1  = System.nanoTime();
		System.out.println("await阻塞当前主线程 time:"+time1);
		c.await();
		long time2  = System.nanoTime();
		System.out.println("t1,t2,t3执行完毕以后开始执行main方法的循环打印。。。 纳秒:"+(time2-time1));
		for (int i = 0; i < 10; i++) {
			System.out.println("main执行第"+i+"个!");
		}
		System.out.println("main执行完毕。");
	}

}

打印结果:

t1,t2,t3开始。。。
await阻塞当前主线程 time:538390978398400
t2执行第0个!
t3执行第0个!
t3执行第1个!
t3执行第2个!
t3执行第3个!
t3执行第4个!
t3执行第5个!
t3执行第6个!
t3执行第7个!
t3执行第8个!
t3执行第9个!
t3执行第10个!
t3执行第11个!
t1执行第0个!
t1执行第1个!
t1执行第2个!
t1执行第3个!
t1执行第4个!
t1执行第5个!
t1执行第6个!
t1执行第7个!
t1执行第8个!
t1执行第9个!
t1执行第10个!
t3执行第12个!
t3执行第13个!
t3执行第14个!
t3执行第15个!
t3执行第16个!
t2执行第1个!
t2执行第2个!
t2执行第3个!
t2执行第4个!
t2执行第5个!
t2执行第6个!
t2执行第7个!
t2执行第8个!
t2执行第9个!
t2执行第10个!
t2执行第11个!
t2执行第12个!
t2执行第13个!
t2执行第14个!
t3执行第17个!
t3执行第18个!
t3执行第19个!
t3执行第20个!
t3执行第21个!
t3执行第22个!
t3执行第23个!
t1执行第11个!
t1执行第12个!
t1执行第13个!
t1执行第14个!
t1执行第15个!
t1执行第16个!
t1执行第17个!
t1执行第18个!
t1执行第19个!
t1执行第20个!
t1执行第21个!
t3执行第24个!
t3执行第25个!
t3执行第26个!
t3执行第27个!
t3执行第28个!
t2执行第15个!
t2执行第16个!
t2执行第17个!
t2执行第18个!
t2执行第19个!
t2执行第20个!
t2执行第21个!
t2执行第22个!
t2执行第23个!
t2执行第24个!
t2执行第25个!
t3执行第29个!
t3执行第30个!
t3执行第31个!
t3执行第32个!
t3执行第33个!
t3执行第34个!
t3执行第35个!
t3执行第36个!
t3执行第37个!
t3执行第38个!
t1执行第22个!
t1执行第23个!
t1执行第24个!
t3执行第39个!
t3执行第40个!
t3执行第41个!
t3执行第42个!
t3执行第43个!
t3执行第44个!
t3执行第45个!
t3执行第46个!
t3执行第47个!
t3执行第48个!
t3执行第49个!
t3执行第50个!
t3执行第51个!
t3执行第52个!
t3执行第53个!
t3执行第54个!
t3执行第55个!
t3执行第56个!
t3执行第57个!
t2执行第26个!
t2执行第27个!
t2执行第28个!
t3执行第58个!
t3执行第59个!
t3执行第60个!
t3执行第61个!
t3执行第62个!
t3执行第63个!
t3执行第64个!
t3执行第65个!
t3执行第66个!
t3执行第67个!
t1执行第25个!
t1执行第26个!
t1执行第27个!
t1执行第28个!
t1执行第29个!
t1执行完毕。
t3执行第68个!
t3执行第69个!
t3执行第70个!
t3执行第71个!
t3执行第72个!
t3执行第73个!
t3执行第74个!
t2执行第29个!
t2执行第30个!
t2执行第31个!
t2执行第32个!
t2执行第33个!
t2执行第34个!
t2执行第35个!
t2执行第36个!
t2执行第37个!
t2执行第38个!
t2执行第39个!
t2执行第40个!
t2执行第41个!
t2执行第42个!
t2执行第43个!
t2执行第44个!
t2执行第45个!
t2执行第46个!
t2执行第47个!
t2执行第48个!
t2执行第49个!
t2执行第50个!
t2执行第51个!
t2执行第52个!
t2执行第53个!
t2执行第54个!
t2执行第55个!
t2执行第56个!
t2执行第57个!
t2执行第58个!
t2执行第59个!
t2执行完毕。
t3执行第75个!
t3执行第76个!
t3执行第77个!
t3执行第78个!
t3执行第79个!
t3执行第80个!
t3执行第81个!
t3执行第82个!
t3执行第83个!
t3执行第84个!
t3执行第85个!
t3执行第86个!
t3执行第87个!
t3执行第88个!
t3执行第89个!
t3执行完毕。
t1,t2,t3执行完毕以后开始执行main方法的循环打印。。。 纳秒:3807700
main执行第0个!
main执行第1个!
main执行第2个!
main执行第3个!
main执行第4个!
main执行第5个!
main执行第6个!
main执行第7个!
main执行第8个!
main执行第9个!
main执行完毕。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值