现在主要讲一下Jetty在处理Connector的策略。先上张图再说吧。这里以BIO为例子来说。
这个图就比(二)中的简单多了。前面还是初始化线程池,就不多说了
1. 初始化SocketConnector,每个SocketConnector相当于一个连接,所以初始化的时候并不会只是初始化一个,会初始化多个。
2. new 一个ServerSocket,这里有一个处理策略的问题,并不是直接就accept了。会有一个内部类Acceptor做为转接,然后把实例化的ServerSocket放到Acceptor对象中。而Acceptor是AbstractConnector中的一个内部类,实现了Runnable,所以可以直接作为一个任务丢到线程池中去处理。run方法也特别有意思,回调了SocketConnector中的accept方法(其实这里accept方法并不会在调用QueuedThreadPool启动线程也就是调用run方法的周期中,为了直观就这样画了),所以看起来会有点绕,Acceptor相当于中转,这样就不会使Connector太重,生命周期太长。这种设计也值得学习。