JUC之CountDownLatch

CountDownLatch是一个同步计数器,属于同步工具类。

CountDownLatch允许一个或多个线程阻塞,直到在其他线程中执行的一组操作完成为止。

CountDownLatch的不足

CountDownLatch被设计为只触发一次,计数值不能被重置。
如果需要重置计数值,可以使用CyclicBarrier。

CountDownLatch的用法

用法1:

将一个程序分为n个互相独立的可解决的任务。
当每个任务完成时,都要在这个锁存器上调用countDwon()方法,锁存器的计数会-1。
等待问题被解决的任务在这个锁存器上调用await()方法,这个任务会阻塞住,直到锁存器的计数为0,这个任务才继续向下执行。

案例:员工下班,保安最后锁门

代码示例:

public class CountDownLatchDemo {
    private static final Integer THREAD_SIZE = 6;
    public static void main(String[] args) {
        CountDownLatch countDownLatch = new CountDownLatch(THREAD_SIZE);
        for (int i = 0; i < THREAD_SIZE; i++) {
            new Thread(() -> {
                System.out.println(Thread.currentThread().getName() + "\t下班,离开公司");
                // 每执行一次,计数器减1
                countDownLatch.countDown();
            }, String.valueOf(i + 1)).start();
        }
        try {
            // 线程阻塞直到计数器为0
            countDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + "\t保安最后锁门");
    }
}

执行结果:

1	下班,离开公司
4	下班,离开公司
3	下班,离开公司
2	下班,离开公司
5	下班,离开公司
6	下班,离开公司
main	保安最后锁门

用法2:

一组工作线程使用两个锁存器,第一个作为启动信号,第二个作为完成信号。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值