JUC并发包系列:CountDownLatch

2022-09-20  本文已影响0人  张云飞Vir

介绍

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 类,通过它来实现计数。

参考

上一篇 下一篇

猜你喜欢

热点阅读