前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JUC并发包系列:CountDownLatch

JUC并发包系列:CountDownLatch

作者头像
张云飞Vir
发布2022-09-29 12:20:46
5350
发布2022-09-29 12:20:46
举报
文章被收录于专栏:写代码和思考

介绍

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

主要方法

代码语言:javascript
复制
构造方法:CountDownLatch(int count)
  构造一个使用给定计数初始化的CountDownLatch 。
  参数:count  次数

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


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

示例用法

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

代码示例

代码语言:javascript
复制
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 类,通过它来实现计数。

参考

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-09-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
  • 示例用法
  • 写在后面
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档