CountDownLatch学习
看了几篇博客,说用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学习的更多相关文章
- Java多线程之CountDownLatch学习
给出官网上的例子:http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/CountDownLatch.html Java中conc ...
- JUC包下CountDownLatch学习笔记
CountDownLatch的作用是能使用多个线程进来之后,且线程任务执行完毕之后,才执行, 闭锁(Latch):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态.通俗的讲就是,一个闭锁相当于 ...
- Gradle项目学习 & HttpAsyncClient学习 & CountDownLatch学习
装了Intellij,就是装了Gradle. 新建一个Gradle项目.然后下面这个页面要勾选上面两项: Use auto-import和Create directories for empty co ...
- 线程等待——CountDownLatch使用
告警性能优化过程中,遇到如下问题:1. 在数据库计算几十万个实体的KPI值的方差:2. 计算结果进行表格化处理. 这里KPI包含多个Counter的数据库函数运算(比如Decode,AVG等函数),方 ...
- Java CountDownLatch解析(下)
写在前面的话 在上一篇CountDownLatch解析中,我们了解了CountDownLatch的简介.CountDownLatch实用场景.CountDownLatch实现原理中的await()方法 ...
- 多个线程运行结束之后主线程再执行CountDownLatch
多个线程运行结束之后主线程再执行CountDownLatch 学习了:http://blog.csdn.net/lvyuanj/article/details/50737123 这个要膜拜一下! h ...
- Java核心知识点学习----多线程 倒计时记数器CountDownLatch和数据交换的Exchanger
本文将要介绍的内容都是Java5中的新特性,一个是倒计时记数器---CountDownLatch,另一个是用于线程间数据交换的Exchanger. 一.CountDownLatch 1.什么是Coun ...
- CountDownLatch的原理学习
转载:http://blog.csdn.net/yanyan19880509/article/details/52349056 前言 前面介绍了ReentrantLock,又叫排他锁,本篇主要通过Co ...
- 多线程学习笔记六之并发工具类CountDownLatch和CyclicBarrier
目录 简介 CountDownLatch 示例 实现分析 CountDownLatch与Thread.join() CyclicBarrier 实现分析 CountDownLatch和CyclicBa ...
随机推荐
- FastDFS 文件上传工具类
FastDFS文件上传工具类 import org.csource.common.NameValuePair; import org.csource.fastdfs.ClientGlobal; imp ...
- 洛谷P4175 网络管理
题意:链上带修第k大. 这毒瘤题...别看题意只有7个字,能把我吊打死... 介绍其中两种做法好了.其实思想上是一样的. 对于每一个点,建立权值线段树,维护它到根路径上的所有权值. 一条路径上的点集就 ...
- Spring3 (事务管理)
简介: 1.事务管理.2.整合Junit.3.整和Web 1 事务管理 1.1 回顾事务 l 事务:一组业务操作ABCD,要么全部成功,要么全部不成功. l 特性:ACID 原子性 ...
- POJ 2299树状数组求逆序对
求逆序对最常用的方法就是树状数组了,确实,树状数组是非常优秀的一种算法.在做POJ2299时,接触到了这个算法,理解起来还是有一定难度的,那么下面我就总结一下思路: 首先:因为题目中a[i]可以到99 ...
- JS with
<script type="text/javascript"> function Dog(){ this.type="dog"; this.tail ...
- sqlserver2008查看表记录或者修改存储过程出现目录名无效错误解决方法
登陆数据库后,右键打开表提示:目录名无效,执行SQL语句也提示有错误,现在把解决方法分享给大家 1.新建查询 2.点工具栏中[显示估计的查询计划],结果提示Documents and Settings ...
- (字符串 枚举)The Hardest Problem Ever hdu1048
The Hardest Problem Ever 链接:http://acm.hdu.edu.cn/showproblem.php?pid=1048 Time Limit: 2000/1000 MS ...
- 2017-12-15python全栈9期第二天第五节之格式化输出补充之想要在格式化输出中表示单纯的%号就加%
#!/user/bin/python# -*- coding:utf-8 -*-name = input('姓名:')age = input('年龄:')height = input('身高:')ms ...
- ByteBuffer详解
注意:一定要了解这个缓冲类的几个方法和那几个字段.不然你不会明白的. 字段: position ,limit ,mark 方法:clear(), hasRemaining(),flip() 推荐博客: ...
- java项目反编译获得源码
经常能找到一些 过时的 项目源码,但是还是有研究价值的.但是肯定是不会给你源码的. 下面介绍怎么反编译: 1.在项目中找到classes这个文件夹,这个就是编译过的文件. 2.下载反编译工具JD-GU ...