认识jetty
1、new Server()所做的事情:
初始化线程池-->QueuedThreadPool-->execute()方法把任务加入job-->任务推入BlockingQueue(具体实现,这个是阻塞队列可待优化)
初始化ServerConnector-->初始化ScheduledExecutorScheduler && ByteBufferPool(对象池)用于每次读写通道
{
用锁大大降低了性能,ArrayByteBufferPool 无锁线程安全:
{
Bucket篮子(size,queue[CuccrentLinkedQueue支持高并发无锁!])
acquire申请(取得合适的Bucket --> 从Bucket取得ByteBuffer-->不存在则新建)
release(取得合适的Bucket-->清空Buffer-->归还Pool)
例外处理,若超过或小于所有篮子大小,则new一个给线程,但无法归还池子。
}
}
&& ConnectionFactory && 取得CPU数量 && 更新acceptor线程数量(等待接收HTTP请求)--> 创建acceptor线程组
&& 初始化ServerConnectorManager --> 保存selector线程数量(拿出数据并不处理具体业务)
设置port
关联server和connector
2、Server.start()所做的事情:
设置启动状态
启动过程doStart():{ 注册ShutdownMonitor可以远程关闭服务器,获取初始化线程池QueuedTreadPool,设置selector【每一个Connect都需要selector,上面就是一个Connect】,计算所需的所有线程数量(如果大于200则中断程序),维护Bean(启动QueuedTreadPool执行job任务&&WebAppContext),启动Connector( 取得ConnectionFactory -->创建 selector线程并启动-->创建acceptor线程并启动(设置线程名字,设置优先级,将自己放入acceptor线程组,监听端口默认阻塞若无线程则设置为非阻塞)) }
启动完毕
3、HTTP请求
Accept成功(设置为非阻塞模式,配置Socket,正式处理(选择可用的ManangerSelector线程,ManagerdSelector处理(提交任务使用的是ConcurrentArrayQueue自己实现的跟ConcurrentLinkedQueue相似的性能,不需要node,GC更少)))
&& 处理请求ManagerdSelector.run() -->不断select() 不断执行任务 具体是Accept.run()将selector和端口绑定返回selectionKey并创建EndPoint
-->处理selectionKey-->onselected()使用新的线程池去处理HTTP业务请求