看了几篇博客,说用CountDownLatch实现一个先执行完子线程,再执行主线程的例子。因此写一篇博客总结一下。

一、CountDownLatch了解

1.CountDownLatch继承了AbstractQueuedSynchronizer类,很多方法都封装了在这个类里面,感兴趣可以看一下。内部写了一个Sync类,对其进行各种操作,以完成各个功能。

2.其原理是实现了一个计数器,通过对计数器操作,来实现对各个子线程的监控

二、例子

1.在启动服务前,需要对各个组件进行健康检查,因此设计一个方案,对各个组件进行检查,环境都ok后,再执行主线程。

2.先定义一个抽象类,该类实现了Runnable,用来进行健康检查

 public abstract class BaseHealthChecker implements Runnable {
//Counter
private CountDownLatch counter;
private String serviceName;
private boolean isServiceOk; public abstract void checkHealth(); public String getServiceName() {
return serviceName;
} public boolean isServiceOk() {
return isServiceOk;
} public BaseHealthChecker(String serviceName, CountDownLatch countDownLatch) {
this.counter = countDownLatch;
this.serviceName = serviceName;
this.isServiceOk = false;
} @Override
public void run() {
try {
checkHealth();
isServiceOk = true;
} catch (Throwable t) {
t.printStackTrace();
isServiceOk = false;
} finally {
//Always count down counter
if (counter != null) {
counter.countDown();
}
}
}
}

3.再定义一个HealthChecker.

 package countdownlatch;

 import java.util.concurrent.CountDownLatch;

 /**
* Created by adrian.wu on 2018/12/18.
*/
public class HealthChecker extends BaseHealthChecker{
public HealthChecker(String serviceName, CountDownLatch counter){
super(serviceName, counter);
} @Override
public void checkHealth(){
System.out.println("Check " + this.getServiceName());
try {
Thread.sleep(7000);
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.println(this.getServiceName() + " is Ok");
}
}

4.设定要检查哪些service

 package countdownlatch;

 import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors; /**
* Created by adrian.wu on 2018/12/18.
*/
public class ApplicationStartupUtil {
private static List<BaseHealthChecker> services; private static CountDownLatch latch; private ApplicationStartupUtil() {
} private final static ApplicationStartupUtil INSTANCE = new ApplicationStartupUtil(); public static ApplicationStartupUtil getInstance() {
return INSTANCE;
} public static boolean checkExternalServices() throws Exception {
//Initialize the service checkers
latch = new CountDownLatch(4); services = new ArrayList<>(); services.add(new HealthChecker("Flink Cluster", latch)); services.add(new HealthChecker("Hbase Cluster", latch)); services.add(new HealthChecker("Spark Cluster", latch)); services.add(new HealthChecker("Kafka Cluster", latch)); Executor executor = Executors.newFixedThreadPool(services.size()); for (final BaseHealthChecker v : services) {
executor.execute(v);
} //wait all threads okay
latch.await(); for (final BaseHealthChecker v : services) {
if (!v.isServiceOk()) {
return false;
}
} return true;
}
}

5.检查服务

 package countdownlatch;

 /**
* Created by adrian.wu on 2018/12/18.
*/
public class Check {
public static void main(String[] args) {
boolean result = false;
try {
result = ApplicationStartupUtil.checkExternalServices();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("Services check is ok. Result: " + result);
}
}

参考:http://www.importnew.com/15731.html

CountDownLatch学习的更多相关文章

  1. Java多线程之CountDownLatch学习

    给出官网上的例子:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html Java中conc ...

  2. JUC包下CountDownLatch学习笔记

    CountDownLatch的作用是能使用多个线程进来之后,且线程任务执行完毕之后,才执行, 闭锁(Latch):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态.通俗的讲就是,一个闭锁相当于 ...

  3. Gradle项目学习 & HttpAsyncClient学习 & CountDownLatch学习

    装了Intellij,就是装了Gradle. 新建一个Gradle项目.然后下面这个页面要勾选上面两项: Use auto-import和Create directories for empty co ...

  4. 线程等待——CountDownLatch使用

    告警性能优化过程中,遇到如下问题:1. 在数据库计算几十万个实体的KPI值的方差:2. 计算结果进行表格化处理. 这里KPI包含多个Counter的数据库函数运算(比如Decode,AVG等函数),方 ...

  5. Java CountDownLatch解析(下)

    写在前面的话 在上一篇CountDownLatch解析中,我们了解了CountDownLatch的简介.CountDownLatch实用场景.CountDownLatch实现原理中的await()方法 ...

  6. 多个线程运行结束之后主线程再执行CountDownLatch

    多个线程运行结束之后主线程再执行CountDownLatch 学习了:http://blog.csdn.net/lvyuanj/article/details/50737123  这个要膜拜一下! h ...

  7. Java核心知识点学习----多线程 倒计时记数器CountDownLatch和数据交换的Exchanger

    本文将要介绍的内容都是Java5中的新特性,一个是倒计时记数器---CountDownLatch,另一个是用于线程间数据交换的Exchanger. 一.CountDownLatch 1.什么是Coun ...

  8. CountDownLatch的原理学习

    转载:http://blog.csdn.net/yanyan19880509/article/details/52349056 前言 前面介绍了ReentrantLock,又叫排他锁,本篇主要通过Co ...

  9. 多线程学习笔记六之并发工具类CountDownLatch和CyclicBarrier

    目录 简介 CountDownLatch 示例 实现分析 CountDownLatch与Thread.join() CyclicBarrier 实现分析 CountDownLatch和CyclicBa ...

随机推荐

  1. MySQL 到底能不能放到 Docker 里跑?

    https://weibo.com/ttarticle/p/show?id=2309404296528549285581 前言 前几月经常看到有 MySQL 到底能不能放到 Docker 里跑的各种讨 ...

  2. Vim常用插件安装及配置方法

    Vundle 安装 git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim 配置 vimrc首部添 ...

  3. Neovim中提示Error: Required vim compiled with +python

    Neovim在编辑python文件时出现错误提示,如下图 原因 出现该错误的原因说明未安装Python2/3的支持 解决方法 使用包管理器安装Neovim的Python支持python-neovim ...

  4. 解决samtools报错:[main_samview] region "chr2:20,100,000-20,200,000" specifies an unknown reference name. Continue anyway.

    根据Samtool 的manual文档介绍,如果想搜索bam文件的某段区域,需要用到以下命令: samtools view aln.sorted.bam chr2:20,100,000-20,200, ...

  5. Linux常用基本命令(less)

    转: Linux常用基本命令(less) LESS:跟more命令的功能类似,都是用于分页显示内容,但是他的性能比more更高,功能比more更丰富,他读取文件是按需加载 格式: less [opti ...

  6. eclipse导出svn源码,如何转化为项目

    1.先导出 2.点击项目右键,选“属性” 3.选择project facets 4.添加对应的支持 5.可进行进一步配置,设置name,然后点击确定等待完成

  7. 如何重置mysql中的root密码

    方法一: 在my.ini的[mysqld]字段加入:skip-grant-tables重启mysql服务,这时的mysql不需要密码即可登录数据库 然后进入mysqlmysql>use mysq ...

  8. 10款 Mac 系统优化清理工具软件推荐和下载

    本文内容及图片来源[风云社区 SCOEE] 在Windows上有各种安全卫士.系统助手等系统优化和清理工具,比如360安全卫士.腾讯安全管家等,同样MacOS系统也有很多好用的系统优化清理工具,体验比 ...

  9. linux服务器,发现大量TIME_WAIT

    linux服务器,发现大量TIME_WAIT 今天登陆linux服务器,发现大量TIME_WAIT参考资料:http://coolnull.com/3605.html 酷喃|coolnull| » 大 ...

  10. Java父类与子类方法调用顺序

    父类 FatherClass package 父类与子类方法调用顺序; /** * 父类 * @author shundong * */ public class FatherClass { priv ...