多线程初始三
来源:互联网 发布:苹果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业务请求
- 多线程初始三
- 初始多线程
- 初始多线程
- 多线程之线程初始
- Java多线程--初始
- 初始java多线程
- 初始docker(三)
- 初始spring(三)
- 初始docker(三)
- 初始博弈【三】Grundy数
- 多线程学习笔记之初始_beginthreadex()
- git的初始设置(三)
- Python学习之初始(三)
- 多线程(三)
- 多线程三
- 三、多线程
- 多线程三
- 多线程(三)
- 支持向量机之计算最大间隔超平面
- 读取xml文件节点-------------①
- java小知识
- RecyclerView的点击事件
- PDF预览之PDF.js在网站上建立pdf.js文档翻译
- 多线程初始三
- Okhttp和拦截器分装类
- 用 Shell 判断字符串包含关系的方法小结
- 20171217
- Android通话录音之坑
- angular中的自定义服务
- input的几个html5属性
- Maven可继承的POM 元素
- IDEA搭建SSM框架流程-使用阿里巴巴druid监控数据源和@Value取出Properties的值