初学CountDownLatch线程计数器

本文通过三个实例详细解析了CountDownLatch在Java并发编程中的应用,包括在同一个线程中倒计数、不同线程间倒计数及其实现效果,并探讨了CountDownLatch与CyclicBarrier的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我不喜欢讲理论, 直接上代码看效果, 简单''粗暴''!

代码1:

	public static void main(String[] args) throws Exception {
		
		CountDownLatch countDownLatch = new CountDownLatch(3);
		
		for (int i = 1; i < 4; i++) {
			System.out.println("第" + i + "次循环开始");
			countDownLatch.await();
			System.out.println("第" + i + "次循环结束");
		}
		
	}

创建一个CountDownLatch对象countDownLatch,  构造参数为int类型, 这里传入3

表示:线程的倒计数个数, 可以在不同线程之间计数, 也可以在同一线程计数

调用 : countDownLatch.countDown(); 方法, 计数器就减1

上面的代码结果为:


代码2: 在同一个线程倒计数

public static void main(String[] args) throws Exception {
		
		CountDownLatch countDownLatch = new CountDownLatch(3);
		
		countDownLatch.countDown();
		countDownLatch.countDown();
		countDownLatch.countDown();
		
		for (int i = 1; i < 4; i++) {
			System.out.println("第" + i + "次循环开始");
			countDownLatch.await();
			System.out.println("第" + i + "次循环结束");
		}
		
	}

结果:

这里也说明,  计数器只倒计数一次, countDownLatch对象后面就没用了


代码3: 在不同线程倒计数

	public static void main(String[] args) throws Exception {
		
		CountDownLatch countDownLatch = new CountDownLatch(3);
		
		for (int i = 0; i < 3; i++) {
			new Thread() {
				public void run() {
					System.out.println(Thread.currentThread().getName() + ":执行你想要的操作");
					try {
						Thread.sleep(5000);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					System.out.println(Thread.currentThread().getName() + "执行结束");
					countDownLatch.countDown();// 线程计数器减1
				}
			}.start();
		}
		
		
		for (int i = 1; i < 4; i++) {
			System.out.println("第" + i + "次循环开始");
			countDownLatch.await();
			System.out.println("第" + i + "次循环结束");
		}
		
	}

结果:  也在预料之中, 3个线程都执行完countDownLatch.countDown(); 后  主线程才执行第1次循环和后面的循环


应用场景:(个人观点)

与CyclicBarrier类似, 可以在每个线程的countDownLatch.countDown();方法后再添加countDownLatch.await();

那么每个线程在countDownLatch.await(); 后面的代码,也是等计数器为0后执行, 可以达到与CyclicBarrier一样的效果,

所以个人认为CountDownLatch与CyclicBarrier的区别主要是:CountDownLatch是一次性的, 而CyclicBarrier可以循环使用

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值