看了几篇博客,说用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. 在centos7下用http搭建配置svn服务

    应用场景:SVN是Subversion的简称,是一个开放源代码的版本控制系统. 安装环境:centos7  //已关闭 Selinux和 Firewall 配置步骤: 1. 安装HTTP和SVN相关软 ...

  2. mysql 替换字符中部分字符,替换使用指定字符

    update table_name set name= replace(name,'我是','是');

  3. Libre OJ 130、131、132 (树状数组 单点修改、区间查询 -> 区间修改,单点查询 -> 区间修改,区间查询)

    这三题均可以用树状数组.分块或线段树来做 #130. 树状数组 1 :单点修改,区间查询 题目链接:https://loj.ac/problem/130 题目描述 这是一道模板题. 给定数列 a[1] ...

  4. 第二十四篇-用VideoView制作一个简单的视频播放器

    使用VideoView播放视频,视频路径有三种: 1. SD卡中 2. Android的资源文件中 3. 网络视频 第一种,SD卡中的方法. 路径写绝对路径,如果不能播放,可以赋予读取权限. 效果图: ...

  5. jQuery 传递对象参数到Spring Controller

    当jQuery 发送ajax请求需要传递多个参数时,如果参数过多,Controller接收参数时就需要定义多个参数,这样接口方法会比较长,也不方便.Spring可以传递对象参数,将你需要的所有查询条件 ...

  6. bash 4

    1)获取字符串长度: str="jwwjww" #str=‘jwwjww’//单引号双引号都一样 echo ${#str} 结果:6 2)提取子字符串 echo ${#str:1: ...

  7. SpringCloud第一弹(入门)

    使用IDEA建立SpringBoot多模块工程不爽啊~算了凑合用吧. 第一步.建立一个POM工程 ..Next ..一路next即可,中间啥也不选 第二步.建立Eureka服务器(这个玩意等同于玩Du ...

  8. Luogu P1117 [NOI2016]优秀的拆分

    题目链接 \(Click\) \(Here\) 这题质量不错,就是暴力分有点足\(hhhhhhhh\),整整有\(95\)分. (搞得我写完暴力都不想写正解直接理解思路之后就直接水过去了\(QwQ\) ...

  9. (set stringstream)单词数 hdu2072

    单词数 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  10. php项目核心业务(增、删、改、查)(第三篇)

    对增删改查数据库的封装 //php对数据库的封装 //Mysql_fetach($sql)函数查询所有的 function Mysql_fetach($sql){ $conn=mysqli_conne ...