跟着ZooKeeper学Java——CountDownLatch和Join的使用
在阅读ZooKeeper的源码时,看到这么一个片段,在单机模式启动的时候,会调用下面的方法,根据zoo.cfg的配置启动单机版本的服务器:
public void runFromConfig(ServerConfig config) throws IOException {
//1 创建ZooKeeper服务器
final ZooKeeperServer zkServer = new ZooKeeperServer();
final CountDownLatch shutdownLatch = new CountDownLatch(1);
zkServer.registerServerShutdownHandler(
new ZooKeeperServerShutdownHandler(shutdownLatch));
...
//2 创建ZooKeeper的NIO线程
cnxnFactory = ServerCnxnFactory.createFactory();
cnxnFactory.configure(config.getClientPortAddress(),
config.getMaxClientCnxns());
cnxnFactory.startup(zkServer);
// 3 调用shutdownLatch阻塞,服务器在新线程正常处理请求
shutdownLatch.await();
// 4 如果有错误,直接调用shutdown
shutdown();
// 5 执行cnx.join()等待NIO线程关闭
cnxnFactory.join();
if (zkServer.canShutdown()) {
zkServer.shutdown(true);
}
}
...
protected void shutdown() {
if (cnxnFactory != null) {
cnxnFactory.shutdown();
}
}
其中比较有意思的两个地方:
1 CountDownLatch的使用
开启NIO新线程接收客户端的请求,服务端的主线程直接利用countdownlatch挂起。这个CountDownLatch之前有说过,就是个多线程的计数器。
详细内容参考文章——Java计数器之CountDownLatch、CyclicBarrier、Semaphore
2 join的作用
join的作用就是主线程遇到A.join()之后,就会挂起;登到A结束后,才会继续执行。可以理解为主线程调用了A的wait方法...
下面有个Join的小例子:
public class JoinTest {
public static void main(String[] args) throws InterruptedException {
Thread A = new Thread(()->{
System.out.println("进入线程A");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("A:线程A结束");
});
A.start();
System.out.println("Main:等待线程A结束");
A.join();
System.out.println("Main:线程A已经结束,退出");
}
}
输出内容为:
Main:等待线程A结束
进入线程A
A:线程A结束
Main:线程A已经结束,退出
可以看到,Main线程在A.join()的地方挂起了。等A结束后,才继续执行。
ZooKeeper这样的设计,使服务器在关闭前,确保NIO线程正确关闭,避免NIO资源的未释放。
跟着ZooKeeper学Java——CountDownLatch和Join的使用的更多相关文章
- 从零开始学 Java - 我放弃了 .NET ?
这不是一篇引起战争的文章 毫无疑问,我之前是一名在微软温暖怀抱下干了近三年的 .NET 开发者,为什么要牛(sha)X一样去搞 Java 呢?因为我喜欢 iOS 阿!哈哈,开个玩笑.其实,开始学 Ja ...
- JAVA多线程之CountDownLatch与join的区别
首先,我们来看一个应用场景1: 假设一条流水线上有三个工作者:worker0,worker1,worker2.有一个任务的完成需要他们三者协作完成,worker2可以开始这个任务的前提是worker0 ...
- 2018年如何快速学Java
前言 只有光头才能变强 提前预警:本文适合Java新手阅读(老手可在评论区给下建议),希望大家看完能有所收获. 一.为什么我要写下这篇文章 1.1直接缘由: 在今天(2018年11月4日)有个同学给我 ...
- 学大数据是先学java还是先学python?
大数据的发展趋势日渐明显,但是进入这个领域的门槛不小,除了要有心理准备,其次就是要付诸实际行动中去学习. 学习方法有很多,在没有基础的前提下,自学是因人而异是有难度.其次是大数据目前的工作方向主要是三 ...
- Linux -- 基于zookeeper的java api(二)
Linux -- 基于zookeeper的java api(二) 写一个关于基于集群的zookeeper的自定义实现HA 基于客户端和监控器:使用监控的方法查看每个注册过的节点的状态来做出操作. Wa ...
- CountDownLatch与join的区别和联系
首先,我们来看一个应用场景1: 假设一条流水线上有三个工作者:worker0,worker1,worker2.有一个任务的完成需要他们三者协作完成,worker2可以开始这个任务的前提是worker0 ...
- Java学习路线图(如何快速学Java)
不知不觉从初学Java到现在已经8年了,今天在这里给刚入门和入门不久的小伙伴们一些建议.可能总结的不是很详细,但给出了一个大概的学习路线.希望对大家有帮助哈~ 如何快速学Java 这里我以Java E ...
- 教妹学 Java:晦涩难懂的泛型
00.故事的起源 “二哥,要不我上大学的时候也学习编程吧?”有一天,三妹突发奇想地问我. “你确定要做一名程序媛吗?” “我觉得女生做程序员,有着天大的优势,尤其是我这种长相甜美的.”三妹开始认真了起 ...
- 我的那些年(12)~公司技术转行,我也跟着转到java了
回到目录 我的那些年(12)~公司技术转行,我也跟着转到java了 CTO换人了 微软技术栈不被认可经常被喷 技术统一向java转 换了mac book后,docker还是很占内存 学习springb ...
随机推荐
- saltstack自动化运维系列⑤之saltstack的配置管理详解
saltstack自动化运维系列⑤之saltstack的配置管理详解 配置管理初始化: a.服务端配置vim /etc/salt/master file_roots: base: - /srv/sal ...
- mysql通过centos本地命令行还原数据库出现乱码问题
将sql文件上传到centos系统中,还原mysql数据库,发现是乱码 mysql -h10.11.8.62 -uroot -p dbtest </data/dbsql/dbtest.sql 数 ...
- windows2008r2系统破解登录密码方法
破解windows 2008 r2系统登录密码方法: 1.重启系统,使用windows2008r2安装光盘引导 按住shift+f10 2.切换到d:windows\system32目录(使用cmd. ...
- 不同系统与程序修改java.library.path的位置(转)
原文地址:http://blog.csdn.net/quqibing001/article/details/51201768 Linux环境 系统变量LD_LIBRARY_PATH来添加Java.li ...
- ios如何实现静音模式下声音仍然可以外放
AVAudioSession *audioSession = [AVAudioSession sharedInstance]; [audioSession setCategory:AVAudioSes ...
- OCM_第五天课程:Section2 —》AGENT 的安装 、GC 的使用
注:本文为原著(其内容来自 腾科教育培训课堂).阅读本文注意事项如下: 1:所有文章的转载请标注本文出处. 2:本文非本人不得用于商业用途.违者将承当相应法律责任. 3:该系列文章目录列表: 一:&l ...
- js闭包之应用场景
闭包的解释 当函数可以记住并访问所在的词法作用域,即使函数是在当前词法作用域之外执行,这时就产生了闭包 在javascript中,只有函数内部的子函数才能读取局部变量,所以说,闭包可以简单理解成“定义 ...
- python----面向对象(2)
反射 class ClassA: name = 'xiaoming' def __init__(self): self.y = 'y' #先执行 __setattr__ 在执行__getattribu ...
- hdu3308
区间合并比较模板的题,就是求一个区间的LCIS 线段树维护左最大LCIS,右最大LCIS,区间LCIS 看代码就行 #include<iostream> #include<cstri ...
- 步步为营-58-SQLite的使用
说明:文档型关系数据库,多用于移动端 1.1 添加引用 ` 1.1.1 System.Data.SQLite.xml 1.1.2 System.Data.SQLite.dll 1.2 连接字符串的设置 ...