线程池的基本概念
-
_threadsStarted:启动的线程数
- _threadsIdle:空闲的线程数
- _lastShrink:记录上次线程结束时间,用于销毁空闲线程
- _threads:使用ConcurrentLinkedQueue来存放线程
- _joinLock:等待线程池结束的锁【不常用】
- _jobs:默认使用BlockingArrayQueue<Runnable>来存放任务队列,当_maxQueued>0的时候会使用ArrayBlockingQueue<Runnable>(_maxQueued)
- _name:线程池的名字
- _maxIdleTimeMs:线程空闲的最大时间
- _maxThreads:最大线程数
- _minThreads:最小线程数
- _maxQueued:任务队列的最大长度,默认-1(无限制即Integer.MAX_VALUE)
- _priority:默认Thread.NORM_PRIORITY,仅在测试环境中使用setThreadsPriority(int priority)【不常用】
- _daemon:是否daemon线程【不常用】
- _maxStopTime:等待线程池结束的最大时间【不常用】
- _detailedDump:是否在调用void dump(Appendable out, String indent)是输出更详细的信息
线程池的常用场景
1)实例化
根据$JETTY_HOME/etc/jetty.xml比如
<Set name="ThreadPool">
<!-- Default queued blocking threadpool -->
<New class="org.eclipse.jetty.util.thread.QueuedThreadPool">
<Set name="minThreads">1</Set>
<Set name="maxThreads">3</Set>
<Set name="detailedDump">false</Set>
</New>
</Set>
会分别调用
- setMinThreads(int minThreads)
- 如果已启动的线程小于最小线程数而且线程池已启动,则开启线程startThread(int threads)
-
setMaxThreads(int maxThreads)
- setDetailedDump(boolean detailedDump)
此时
线程组_threads为空
任务队列_jobs为null
2)启动doStart()
- _threadsStarted设置为0
- 实例化_jobs为BlockingArrayQueue(默认无限制即Integer.MAX_VALUE)
- 启动minThreads个worker线程
3)提交dispatch(Runnable job)
- 往jobs队列中添加job
- 如果添加成功,检查如果没有空闲线程,或者jobs中等待处理的job个数大于空闲线程 而且此时未达到最大线程数则启动新线程
4)还有几个不太常用的场景就不赘述了
-
String dumpThread(long id) //dump单个线程信息
-
boolean interruptThread(long id)//中断线程池中某个线程
-
void dump(Appendable out, String indent)//dump所有线程
- void join() //等待线程池停止
-
void doStop()//停止
线程池中的线程生命周期
1)进入job循环,不断从jobs队列取job2)如果取不到job退出job循环进入idle循环有一个_threadsIdle变量专门记录worker线程进入idle循环个数3)如果_maxIdleTimeMs<0(默认60秒),线程阻塞等待jobs中job,一旦取到再次进入job循环,到1)4)否则检查当前启动线程数是否大于最小线程数,如果是且空闲时间超过_maxIdleTimeMs,则结束该线程5)否则线程阻塞等待jobs,超时设为_maxIdleTimeMs,如果拿到job再次进入job循环到1),否则到3)
小结
- jetty默认线程池QueuedThreadPool实现较为简单
- 没有什么额外的管理线程来增减线程,线程的增减在运行是自动完成,比如dispatch会添加线程,线程会根据情况自己销毁
- 和外界的常用接口就是dispatch和execute(会调用dispatch)
- 也就是往jobs队列中丢任务
- 某些线程池比如tomcat5或者varnish会将task直接扔给线程而不是队列,如果无空闲线程才会扔到等待队列
- varnish中的线程被唤醒后会优先从等待队列中取任务
- jetty 线程没有所谓的tomcat中的等待队列的概念
注意:
- 如果_maxQueued没有设定即为-1,那么任务队列会为Integer.MAX_VALUE,此时是存在风险的
- _maxIdleTimeMs并不完全是某个线程的空闲时间,很有可能某个线程还没空闲_maxIdleTimeMs就结束掉了,因为jetty的线程池会有一个全局的_lastShrink记录销毁时间,判断是否结束的公式是now-_lastShrink>_maxIdleTimeMs,显然更精确的公式应该是now-$(线程进入idle loop的时间)>_maxIdleTimeMs
分享到:
相关推荐
spring boot内置jetty开发,附带一些基础小功能,比如上传下载文件,走马灯,图片预览等等。
NULL 博文链接:https://vista-rui.iteye.com/blog/1386427
jetty内嵌实现,手动启动 WEB服务,不用发布到服务器上就可以访问。
使用jetty实现websocket功能,jetty已经集成了websocket的标准方法。
jdk1.7 jetty9.2.13 maven3.3.3 很基础的例子,来自官网,写成了DEMO,更加方便学习。包括jetty作为Http 服务器和 Web 容器的基础实现。
isolation-threadpool从Hystrix核心代码中提取出来的线程池隔离的代码,可以非常方便的在Web应用中实现线程池隔离使用场景我们的应用在使用Jetty服务时,多个HTTP服务会共享同一个线程池,当其中一个服务依赖的其他...
jetty-security-9.4.8.v20171121.jar,jetty-io-9.4.8.v20171121.jar,jetty-continuation-9.4.8.v20171121.jar,jetty-client-9.4.8.v20171121.jar,jetty-jmx-9.4.8.v20171121.jar,jetty-plus-9.4.8.v20171121....
用jetty8.0写的websocket实现的简单聊天程序,供大家一起共同分享学习。
eclipse jetty插件,从...下载run-jetty-run.zip文件,解压后再编写个links文件丢到eclipse的dropins目录下即可,省去了使用eclipse update方式安装的麻烦。 link文件样例如: path=d:\\eclipse_plugins\\run-jetty-run
jetty嵌入Web编程多种实现方式案例
Jetty软件包内容: jetty-distribution-9.4.51.v20230217.tar.gz jetty-distribution-9.4.51.v20230217.zip jetty-home-10.0.15.tar.gz jetty-home-10.0.15.zip jetty-home-11.0.15.tar.gz jetty-home-11.0.15.zip ...
Jetty是一个纯Java实现的开源Servlet容器,Jetty也可以作为HTTP服务器和HTTP客户端,Jetty仪器轻巧,稳定和高性能而著称,完全可以胜任企业级Servlet容器的要求。Jetty允许Apache Licence 2.0或者Eclipse Public ...
jetty嵌入式服务器开发所必须的jar包,本人使用jetty版本为6.1.3,jar包总数为9个,来自jetty:commons-el-1.0.jar,jasper-compiler-5.5.15,jasper-compiler-jdt-5.5.15.jar,jasper-runtime-5.5.15.jar,jetty-...
jetty是什么 jetty配置 jetty使用 jetty嵌入 jetty启动 jetty部署 jetty教程 jetty嵌入式 jetty
jetty源码剖析,通过此文档可以了解Jetty的实现原理和阅读底层代码。
另外 Jetty 设计了非常良好的接口,因此在 Jetty 的某种实现无法满足用户的需要时,用户可以非常方便地对 Jetty 的某些实现进行修改,使得 Jetty 适用于特殊的应用程序的需求。 易嵌入性 Jetty 设计之初就是作为...
jetty相关所有jar包,包含jar包: jetty-continuation-8.1.15.v20140411,jetty-http-8.1.15.v20140411,jetty-io-8.1.15.v20140411,jetty-security-8.1.15.v20140411,jetty-server-8.1.15.v20140411,jetty-util-8.1.15...
maven集成jetty必须jar包maven-jetty-plugin,内含多个版本
Equinox中使用Jetty实现HTTP Service Felix中使用Jetty实现HTTP Service PAX中使用Jetty实现HTTP Srevice ProSyst mBedded Server Equinox Edition Spring Dynamic Modules里的Jetty JOnAS5里的Jetty 配置Ajax、...
jetty8以及依赖包,学习的好代码,包括NIO和servlet的实现等