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 ...
随机推荐
- CodeForces - 589J(DFS)
题目链接:http://codeforces.com/problemset/problem/589/J 题目大意:一个机器人打扫一个密闭的房间,房间由一个矩形构成,'*'表示家具,'.'表示该位置为空 ...
- Spring Boot 1.X和2.X优雅重启实战
纯洁的微笑 今天 项目在重新发布的过程中,如果有的请求时间比较长,还没执行完成,此时重启的话就会导致请求中断,影响业务功能,优雅重启可以保证在停止的时候,不接收外部的新的请求,等待未完成的请求执行完成 ...
- docker镜像操作
1.获取镜像 docker pull NAME[:TAG] 如果不显式地指定TAG,则默认会选择latest标签,即下载仓库中最新版本的镜像.//获取最新镜像docker pull ubuntu // ...
- 洛谷P4390 Mokia CDQ分治
喜闻乐见的CDQ分治被我搞的又WA又T..... 大致思路是这样的:把询问用二维前缀和的思想拆成4个子询问.然后施CDQ大法即可. 我却灵光一闪:树状数组是可以求区间和的,那么我们只拆成两个子询问不就 ...
- Django 创建超级用户
Django自带的后台管理是Django明显特色之一,可以让我们快速便捷管理数据.后台管理可以在各个app的admin.py文件中进行控制 #创建超级用户 python manage.py creat ...
- pycharm 出现 "PEP:8 expected 2 blank lines ,found 0"
https://blog.csdn.net/modangtian/article/details/79687623 这句话的意思是“有两个空白行,但是没有发现.” 在声明函数的那一行的上方必须有两行的 ...
- Windows 查看端口占用情况
今天打算运行一下当年的毕业设计,结果启动ActiveMQ的时候,发现报错 原来是端口占用了.在Windows上怎样看呢? Ctrl+Alt+Del 调出任务管理器 再找到资源监视器 原来是依赖于Erl ...
- HDU3974 Assign the task
Assign the task Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 高级组件——选项卡面板JTabbedPane
选项卡面板:JTabbedPane(标签位置,布局方式) 标签位置:JTabbedPane.TOP,JTabbedPane.BOTTOM,JTabbedPane.LEFT,JTabbedPane.RI ...
- assert的使用
1.eclipse.myeclipse开启assert(断言),默认是关闭,如下: 说白了就是设置一下jvm的参数,参数是-ea或者-enableassertions 2.assert格式 (1)as ...