美文网首页
JUC并发包系列:CountDownLatch

JUC并发包系列:CountDownLatch

作者: 张云飞Vir | 来源:发表于2022-09-20 20:57 被阅读0次

介绍

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

参考

相关文章

网友评论

      本文标题:JUC并发包系列:CountDownLatch

      本文链接:https://www.haomeiwen.com/subject/gnjiortx.html