目录
- WorkerService
- 数据结构
- 构造函数
- ConnectionExpirerThread
WorkerService
前面的SelectorThread获取到IO就绪的连接后会将其包装成IOWorkRequest并交给worker线程处理,先看下这个过程:
从代码中可以看到,如果WorkerService中没有就绪的线程池则直接运行任务,如果有则将其提交给线程池处理,接下来我们先看下WorkerService的数据结构
数据结构
构造函数
默认情况下只生成1个线程池ExecutorService,它有numWorkerThreads
个线程,WorkerService类中定义了创建线程的工厂DaemonThreadFactory,简单看下其源码:
该线程工厂用于创建名字为NIOWorkerThread-序号
的守护线程。
上述过程主要是介绍WorkerService的构造过程以及线程池创建线程的工厂DaemonThreadFactory,前面介绍过,从SelectorThread提交的任务类型为IOWorkRequest,提交到WorkerService会包装成ScheduledWorkRequest,它实现了Runnable接口,所以它的核心代码在run()
方法中,接下来我们分析该方法。
接着到IOWorkRequest
最后WorkerService将IO就绪的key交给NIOServerCnxn处理,后文再详细分析后者的处理过程。
ConnectionExpirerThread
ConnectionExpirerThread的工作就是不断检查连接队列,如果队列中的连接过期则将其关闭。
至此,ServerCnxnFactory的工作原理就是如此,我们用流程图总结一下。
上述的每一个run()
函数内部都是一个死循环,它会不停的工作直到ServerCnxnFactory关闭。