Tomcat NIO源代码分析(一) -
当Tomcat配置成使用NIO时,启动过程其实和过去差不多,也是Connector#startInternal -> Protocol(Http11NioProtocol)#start() -> Endpoint(NioEndPoint)#start()的过程,这里主要看一下NioEndPoint:<div style="border-left-color: #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; width: 98%; font-size: 13px;"> 1http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gifhttp://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif public void start() throws Exception {
2http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif // 初始化
3http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gifhttp://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif if (!initialized) {
4http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif init();
5http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif }
6http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gifhttp://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif if (!running) {
7http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif running = true;
8http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif paused = false;
9http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif
10http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif // 创建一个ThreadPoolExecutor对象,和JDK里的功能一样,只不过进行了一些扩展
11http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gifhttp://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif if (getExecutor() == null) {
12http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif createExecutor();
13http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif }
14http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif
15http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif // 开启poll的线程
16http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif pollers = new Poller;
17http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gifhttp://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif for (int i = 0; i < pollers.length; i++) {
18http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif pollers = new Poller();
19http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif Thread pollerThread = new Thread(pollers, getName() + "-ClientPoller-" + i);
20http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif pollerThread.setPriority(threadPriority);
21http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif pollerThread.setDaemon(true);
22http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif pollerThread.start();
23http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif }
24http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif
25http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif // 开启Acceptor的线程
26http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gifhttp://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif for (int i = 0; i < acceptorThreadCount; i++) {
27http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif Thread acceptorThread = new Thread(new Acceptor(), getName() + "-Acceptor-" + i);
28http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif acceptorThread.setPriority(threadPriority);
29http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif acceptorThread.setDaemon(getDaemon());
30http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif acceptorThread.start();
31http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif }
32http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif }
33http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif }
页:
[1]