前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java并发编程工具类之CountDownLatch

java并发编程工具类之CountDownLatch

作者头像
简单的程序员
发布2020-04-18 00:29:48
5270
发布2020-04-18 00:29:48
举报
文章被收录于专栏:奕仁专栏

CountDownLatch是什么?

CountDownLatch如何工作?

在实时系统中的应用场景

应用范例

常见的面试题

CountDownLatch是什么

CountDownLatch是在java1.5被引入的,跟它一起被引入的并发工具类还有CyclicBarrier、Semaphore、ConcurrentHashMap和BlockingQueue,它们都存在于java.util.concurrent包下。CountDownLatch这个类能够使一个线程等待其他线程完成各自的工作后再执行。例如,应用程序的主线程希望在负责启动框架服务的线程已经启动所有的框架服务之后再执行。

CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁上等待的线程就可以恢复执行任务。

file
file

以同步方式发消息为例子,同步发送完短信以及推送公众号之后再执行主线程 代码如下:

代码语言:javascript
复制
package org.choviwu.movie.test.countdownlatch;
import java.util.concurrent.CountDownLatch;

/**
 * 发送消息基类
 * @author ChoviWu
 */
public abstract class AbstractMessage {

    /**
     * 设置该变量 并在构造器中初始化
     */
    protected  CountDownLatch countDownLatch ;

    public AbstractMessage(CountDownLatch countDownLatch){
        this.countDownLatch = countDownLatch;
    }

    /**
     * 编写一个发送消息的方法
     * @param user
     */
    public abstract void sendMessage(String user);
}
代码语言:javascript
复制
package org.choviwu.movie.test.countdownlatch;

import java.util.concurrent.CountDownLatch;

/**
 * @author ChoviWu
 * 发送短信
 */
public  class SmsMessage extends AbstractMessage{


    public SmsMessage(CountDownLatch countDownLatch) {
        super(countDownLatch);
    }

    @Override
    public   void sendMessage(String user){
        try {
            //这里是模拟一下线程执行的时间
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("短信已经成功发送给:"+ user);
        //发送成功通知主线程 -1
        this.countDownLatch.countDown();
    }
}
代码语言:javascript
复制
package org.choviwu.movie.test.countdownlatch;
import java.util.concurrent.CountDownLatch;

/**
 * @author ChoviWu
 */
public  class WechatMessage extends AbstractMessage{


    public WechatMessage(CountDownLatch countDownLatch) {
        super(countDownLatch);
    }

    @Override
    public   void sendMessage(String user ){
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("微信服务号已经成功发送给:"+ user);
        //发送成功通知主线程 -1
        this.countDownLatch.countDown();
    }
}

写一个测试类测试一下:

代码语言:javascript
复制
package org.choviwu.movie.test;

import com.google.common.collect.Lists;
import org.choviwu.movie.test.countdownlatch.AbstractMessage;
import org.choviwu.movie.test.countdownlatch.SmsMessage;
import org.choviwu.movie.test.countdownlatch.WechatMessage;

import java.util.List;
import java.util.concurrent.CountDownLatch;

public class CountDownLatchTest {


    public static void main(String[] args) {
        CountDownLatch countDownLatch = new CountDownLatch(2);

        List<AbstractMessage> list = Lists.newArrayList();
        list.add(new SmsMessage(countDownLatch));
        list.add(new WechatMessage(countDownLatch));
        long startTime = System.currentTimeMillis();
            //开启两个线程分别执行发送短信和推送服务号
            list.forEach(message ->{
                new Thread(()-> {
                message.sendMessage("奕仁");
            }).start();
        });
        try {
            //主线程在等待
            System.out.println("主线程预备阶段");
            countDownLatch.await();
            System.out.println("时间差:"+(System.currentTimeMillis()-startTime)/1000 + "秒");
            System.out.println("子线程执行完通知主线程完毕");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
file
file

以上就是CountDownLatch的

框架中用到CountDownLatch

基于Zookeeper的分布式锁(zk的watcher机制)

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • CountDownLatch是什么?
  • CountDownLatch如何工作?
  • 在实时系统中的应用场景
  • 应用范例
  • 常见的面试题
    • CountDownLatch是什么
    相关产品与服务
    短信
    腾讯云短信(Short Message Service,SMS)可为广大企业级用户提供稳定可靠,安全合规的短信触达服务。用户可快速接入,调用 API / SDK 或者通过控制台即可发送,支持发送验证码、通知类短信和营销短信。国内验证短信秒级触达,99%到达率;国际/港澳台短信覆盖全球200+国家/地区,全球多服务站点,稳定可靠。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档