上一篇讲到QuorumPeer中的start()方法主要做了几件事情
1、检查myid
2、恢复数据到内存中
3、开启ServerCnxn网络通讯组件
4、进行leader选举
5、开启jvm监听器
6、开始线程
以上的2、3、4、6是重点
我们先跳过第二点,先来看看第三点,如何开启ServerCnxn网络通讯组件
private void startServerCnxnFactory() {
if (cnxnFactory != null) {
cnxnFactory.start();
}
if (secureCnxnFactory != null) {
secureCnxnFactory.start();
}
}
这个代码很容易读懂,不得不再次称赞,zookeeper的代码写得非常好,可读性非常高
可以看到,主要是执行cnxnFactory的start方法
start()方法跟进去看看
@Override
public void start() {
stopped = false;
if (workerPool == null) {
workerPool = new WorkerService("NIOWorker", numWorkerThreads, false);
}
for (SelectorThread thread : selectorThreads) {
if (thread.getState() == Thread.State.NEW) {
thread.start();
}
}
// ensure thread is started once and only once
if (acceptThread.getState() == Thread.State.NEW) {
acceptThread.start();
}
if (expirerThread.getState() == Thread.State.NEW) {
expirerThread.start();
}
}
我们可以发现,上面这段代码只要做了一下几个事情
1、创建WorkerService线程池
2、开启所有的selectorThreads线程
3、开启acceptThread线程
4、开启expirerThread线程
这里涉及几个概念还有网络通讯模型,非常重要!
1、工作线程池
2、selector线程、accept线程、expirer线程,接下来我们就着重分析网络通讯模型是怎么样的