多线程初始三

来源:互联网 发布:苹果cms使用cdn问题 编辑:程序博客网 时间:2024/05/17 02:27

认识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业务请求