`
helpbs
  • 浏览: 1161868 次
文章分类
社区版块
存档分类
最新评论

jetty线程池的实现

 
阅读更多

线程池的基本概念

  • _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队列取job
2)如果取不到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

    spring boot内置jetty开发,附带一些基础小功能,比如上传下载文件,走马灯,图片预览等等。

    通过Jetty实现文件上传下载的小工具

    NULL 博文链接:https://vista-rui.iteye.com/blog/1386427

    jetty内嵌实现

    jetty内嵌实现,手动启动 WEB服务,不用发布到服务器上就可以访问。

    jetty实现websocket功能

    使用jetty实现websocket功能,jetty已经集成了websocket的标准方法。

    jetty+maven webapp,http,https实现的简单demo

    jdk1.7 jetty9.2.13 maven3.3.3 很基础的例子,来自官网,写成了DEMO,更加方便学习。包括jetty作为Http 服务器和 Web 容器的基础实现。

    isolation-threadpool:从Hystrix核心代码中提取出来的线程池隔离的代码,可以非常方便的在Web应用中实现线程池隔离

    isolation-threadpool从Hystrix核心代码中提取出来的线程池隔离的代码,可以非常方便的在Web应用中实现线程池隔离使用场景我们的应用在使用Jetty服务时,多个HTTP服务会共享同一个线程池,当其中一个服务依赖的其他...

    jetty相关的全部jar包

    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实现的简单聊天程序

    用jetty8.0写的websocket实现的简单聊天程序,供大家一起共同分享学习。

    eclipse jetty插件run-jetty-run-1.3.3

    eclipse jetty插件,从...下载run-jetty-run.zip文件,解压后再编写个links文件丢到eclipse的dropins目录下即可,省去了使用eclipse update方式安装的麻烦。 link文件样例如: path=d:\\eclipse_plugins\\run-jetty-run

    jetty嵌入Web编程多种实现方式案例

    jetty嵌入Web编程多种实现方式案例

    Jetty多版本软件包

    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 cometd(Continuation)学习笔记

    Jetty是一个纯Java实现的开源Servlet容器,Jetty也可以作为HTTP服务器和HTTP客户端,Jetty仪器轻巧,稳定和高性能而著称,完全可以胜任企业级Servlet容器的要求。Jetty允许Apache Licence 2.0或者Eclipse Public ...

    jetty嵌入式服务器必须的jar包

    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-...

    jetty6 指南书

    jetty是什么 jetty配置 jetty使用 jetty嵌入 jetty启动 jetty部署 jetty教程 jetty嵌入式 jetty

    jetty源码剖析

    jetty源码剖析,通过此文档可以了解Jetty的实现原理和阅读底层代码。

    jetty-5.1.12

    另外 Jetty 设计了非常良好的接口,因此在 Jetty 的某种实现无法满足用户的需要时,用户可以非常方便地对 Jetty 的某些实现进行修改,使得 Jetty 适用于特殊的应用程序的需求。 易嵌入性  Jetty 设计之初就是作为...

    jetty相关所有jar包

    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,多版本

    maven集成jetty必须jar包maven-jetty-plugin,内含多个版本

    Jetty中文手册

    Equinox中使用Jetty实现HTTP Service Felix中使用Jetty实现HTTP Service PAX中使用Jetty实现HTTP Srevice ProSyst mBedded Server Equinox Edition Spring Dynamic Modules里的Jetty JOnAS5里的Jetty 配置Ajax、...

    jetty 8及依赖包

    jetty8以及依赖包,学习的好代码,包括NIO和servlet的实现等

Global site tag (gtag.js) - Google Analytics