JUC并发包系列:CountDownLatch

介绍

CountDownLatch 是一种同步辅助,允许一个或多个线程等待,直到在其他线程中执行的一组操作完成。
CountDownLatch 使用一个指定 数 进行初始化,await方法一直阻塞,其他线程调用 countDown方法 直到当前计数达到零,
之后所有等待的线程都被释放,任何后续的await调用立即返回。
这是一次性的现象(计数无法重置)。如果您需要重置计数的版本,请考虑使用CyclicBarrier 。

主要方法

构造方法:CountDownLatch(int count)
  构造一个使用给定计数初始化的CountDownLatch 。
  参数:count  次数

void await() 方法:
  导致当前线程等待直到锁存器倒计时到零,除非线程被中断。如果当前计数为零,则此方法立即返回


void countDown()
  减少锁存器的计数,如果计数达到零,则释放所有等待线程。

示例用法

  • 示例用法:这是一对类,其中一组工作线程使用两个倒计时锁存器:
  • 第一个是启动信号,它阻止任何工人继续前进,直到司机准备好让他们继续前进;
  • 第二个是完成信号,允许驱动程序等待所有工作人员完成。

代码示例

public class CountDownLatchDemo2 {

    public static void main(String[] arr) throws InterruptedException {
        CountDownLatch startSignal = new CountDownLatch(1); // 开始信号
        CountDownLatch doneSignal = new CountDownLatch(6);  // 完成结束信号

        // 来6个工人
        for (int i = 0; i < 6; i++) {
            new Thread(new Worker(startSignal, doneSignal)).start();
        }

        startSignal.countDown();// 老板这里喊:开干
        doneSignal.await();// 老板等着 "工人们" 干完活

        System.out.printf("%s 全部手工\n", Thread.currentThread().getName());
    }

    // 工人
    public static class Worker implements Runnable {
        final CountDownLatch startSignal;// 开始信号
        final CountDownLatch doneSignal; // 完成结束信号

        public Worker(CountDownLatch startSignal, CountDownLatch doneSignal) {
            this.startSignal = startSignal;
            this.doneSignal = doneSignal;
        }

        @Override
        public void run() {
            try {
                startSignal.await();// 等着老板喊 "开始"
                doSomeWork();
                doneSignal.countDown();// 干完了 汇报
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        private void doSomeWork() { // 干活
            System.out.printf(" %s 干活\n", Thread.currentThread().getName());
        }
    }
}

写在后面

看源代码,CountDownLatch 内部写了个 继承自 AbstractQueuedSynchronizer 的 Sync 类,通过它来实现计数。

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值