Java 线程池之Jetty 线程池学习总结
Java 线程池之Jetty 线程池学习总结
前提
Jetty 11.0.x
为什么是Jetty?
Java提供4中创建线程池的快捷方式
Executors.newFixedThreadPool();
Executors.newCachedThreadPool();
Executors.newSingleThreadExecutor();
Executors.newScheduledThreadPool();
但通常我们很少用这4个工厂方法去创建线程池,而是直接使用ThreadPoolExecutor
类构造线程池,因为这些工厂方法最终也是调用这个类来创建线程池的。
众所周知,虽然ThreadPoolExecutor
提供了corePoolSize
和maximumPoolSize
两个参数来控制线程池的基本大小和最大大小,但是这两个参数并不是那么好用:当任务队列采用SynchronousQueue
时,通常需要无界的maximumPoolSize
;当任务队列采用无界队列时,maximumPoolSize
的值又相当于不起作用;当任务队列采用有界队列时,仅在任务队列已满,且未达到maximumPoolSize
时才会扩充线程池大小。
既然如此,那有没有一种更简单的实现方案呢?使用该方案,使用者只需要简单的配置下线程池的基本大小和最大大小,程序就可以根据任务的繁忙程度自动调整当前线程数量。答案是有的:Jetty--一个基于Java的web容器,和Tomcat齐名
Jetty线程池介绍
任务处理流程
初始化线程池
程序初始化运行时,会先创建线程池,线程池大小默认为minThreads
,也就是说会预先创建minThreads
个线程,线程名称格式形如“qtp1076496284-13”
创建线程池时:
如果未指定最大线程数(
maxThreads
),则默认为 200;如果未指定最小线程数(
minThreads
),则默认为 8如果未指定线程空闲超时时间(
idleTimeout
),则默认为 60000,即60秒保留线程数(
reservedThreads
)默认为 -1如果未指定任务队列,则默认创建
BlockingArrayQueue
任务队列,容量大小为 8 x 1024如果指定的最大线程数小于最小线程数,则抛出异常
线程池扩缩容
- 当前线程数比最小线程数小,或者没有空闲的线程,且当前线程数(
threads
)小于最大线程数,则创建线程; idleTimout
大于0且当前线程数大于最小线程数,且线程空闲时间超过idleTimeout
,则停止线程
注意:程序判断是否存在空闲线程的逻辑是这样的:Net空闲线程数 = 空闲线程数 - 任务队列大小,如果“Net空闲线程数”为负数,则表示不存在空闲线程,即需要更多的线程来处理任务。
任务队列及线程相关定义
queueSize
任务队列大小,即队列中等待被线程执行的任务数。可通过getQueueSize()
函数获取。
threads
当前线程池中的线程数,包括已租给内部组件的线程、空闲线程、保留线程,以及正在执行临时作业的线程。threads
= readyThreads
+ leasedThreads
+ utilizedThreads
。 可通过getThreads()
函数获取。
readyThreads
准备执行临时任务的线程数。readyThreads
= idleThreads
+ availableReservedThreads
。可通过getReadyThreads()
函数获取。
idleThreads
未被保留的空闲线程数。idleThreads
= readyThreads
- availableReservedThreads
。可通过getIdleThreads()
函数获取。
reservedThreads
保留的线程数,默认值为-1。可通过getReservedThreads()
函数获取。
availableReservedThreads
可用的保留线程。可通过getAvailableReservedThreads()
函数获取。
leasedThreads
供内部组件使用,用于执行内部任务的线程。需要线程的Jetty组件(比如网络acceptors
和selector
)可能会使用ThreadPoolBudget
从线程池中租用线程。站在线程池的角度来看,这些被租用的线程是活跃的,但是不能用于执行临时任务,比如一个HTTP请求,或者一个WebSocket帧。QueuedThreadPool
有一个ReservedThreadExecutor
,该组件会从线程池租用线程,但会让这些线程可用,就像它们是“idle”线程一样。线程池启动后,该值一般是恒定的。可通过getLeasedThreads()
函数获取。
minThreads
线程池中的最小线程数。可通过getMinThreads()
函数获取。
maxThreads
线程池中的最大线程数。可通过getMaxThreads()
函数获取。
maxAvailableThreads
可用于执行临时任务的最大线程数。maxAvailableThreads
= maxThreads
- leasedThreads
可通过getMaxAvailableThreads()
函数获取。
utilizedThreads
执行临时任务的线程数,可通过getUtilizedThreads()
函数获取。utilizedThreads
= threads
- leasedThreads
- readyThreads
utilizationRate
= utilizedThreads
/ maxAvailableThreads
执行临时任务的线程利用率。该值为0.0D
则表示线程池未被利用,如果为1.0D
则表示线程池被充分利用于执行临时任务。可通过getUtilizationRate()
函数获取。
busyThreads
正在执行内部任务和临时任务的线程数。 busyThreads
= utilizedThreads
+ leasedThreads
。可通过getBusyThreads()
函数获取。
参考链接
https://www.eclipse.org/jetty/javadoc/jetty-11/org/eclipse/jetty/util/thread/QueuedThreadPool.html
Java 线程池之Jetty 线程池学习总结的更多相关文章
- Java 线程池的原理与实现学习(三)
一简介 线程的使用在java中占有极其重要的地位,jdk1.4及其之前的jdk版本,关于线程池的使用是极其简陋的.在jdk1.5之后这一情况有了很大的改观,Jdk1.5之后加入了java.util.c ...
- Java 线程池的原理与实现学习(二)
java类库中提供的线程池简介: java提供的线程池更加强大,相信理解线程池的工作原理,看类库中的线程池就不会感到陌生了. execute(Runnable command):履行Ruannable ...
- Java 线程池的原理与实现学习(一)
线程池:多线程技术主要解决处理器单元内多个线程执行的问题,它可以显著减少处理器单元的闲置时间,增加处理器单元的吞吐能力. 假设一个服务器完成一项任务所需时间为:T1 创建线程时间,T2 在线程中 ...
- 转:Java Web应用中调优线程池的重要性
不论你是否关注,Java Web应用都或多或少的使用了线程池来处理请求.线程池的实现细节可能会被忽视,但是有关于线程池的使用和调优迟早是需要了解的.本文主要介绍Java线程池的使用和如何正确的配置线程 ...
- Java Web应用调优线程池
最简单的单线程 我们先从基础开始.无论使用哪种应用服务器或者框架(如Tomcat.Jetty等),他们都有类似的基础实现.Web服务的基础是套接字(socket),套接字负责监听端口,等待TCP连接, ...
- Java Web应用中调优线程池的重要性
不论你是否关注,Java Web应用都或多或少的使用了线程池来处理请求.线程池的实现细节可能会被忽视,但是有关于线程池的使用和调优迟早是需要了解的.本文主要介绍Java线程池的使用和如何正确的配置线程 ...
- 【java】之常用四大线程池用法以及ThreadPoolExecutor详解
为什么用线程池? 1.创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处-理效率2.线程并发数量过多,抢占系统资源从而导致阻塞3.对线程进行一些简单的管理 在Java中,线程池 ...
- java线程一之创建线程、线程池以及多线程运行时间统计
线程和进程的基本概念 进程和线程是动态的概念. 进程是 "执行中的程序",是一个动词,而程序是一个名词,进程运行中程序的"代码",而且还有自己的 ...
- java基础(26):Thread、线程创建、线程池
1. 多线程 1.1 多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并 ...
- Java 线程池中的线程复用是如何实现的?
前几天,技术群里有个群友问了一个关于线程池的问题,内容如图所示: 关于线程池相关知识可以先看下这篇:为什么阿里巴巴Java开发手册中强制要求线程池不允许使用Executors创建? 那么就来和大家探讨 ...
随机推荐
- 一个简单demo展示应用接口使用goroutine优雅退出
package main import ( "context" "errors" "log" "net/http" &q ...
- Android 13 - Media框架(8)- MediaExtractor
关注公众号免费阅读全文,进入音视频开发技术分享群! 上一篇我们了解了 GenericSource 需要依赖 IMediaExtractor 完成 demux 工作,这一篇我们就来学习 android ...
- 不使用循环语句用if和else实现循环
如果不使用循环语句,可以使用递归函数来实现循环的效果.递归函数是指在函数内部调用自身的函数.下面是一个使用递归函数来实现循环的示例: (初学者记得写include,这里是个普通函数,所以我没写) de ...
- Specs satisfying the `flutter_twitter (from `.symlinks/plugins/flutter_twitter/ios`)` dependency were found, but they required a higher minimum deployment target
MXFlutter的依赖发生变化,需要将iOS最低系统版本提高 修改之后,进入到MXFlutter目录,执行 flutter run 发现编译错误 咨询了下,mxflutter需要flutter为 用 ...
- 日常Bug排查-MVCC和for update混用导致读数据不一致
日常Bug排查-MVCC和for update混用导致读数据不一致 前言 日常Bug排查系列都是一些简单Bug的排查.笔者将在这里介绍一些排查Bug的简单技巧,同时顺便积累素材. Bug现场 又是喜闻 ...
- MyBatis实现MySQL表字段及结构的自动增删
前言 在开发过程中,总会涉及到数据库表结构字段的增加或者删除,或者是索引的增加和减少,这个时候能把修改表结构字段这些工作都交给程序来进行,那能大大方便开发.正好有一个现成的工具可以在springboo ...
- 大数据平台搭建手册——hadoop
从0开始 超详细搭建hadoop平台手册 创建三台使用centos7操作系统的虚拟机 基础环境配置 ps:不建议使用DHCP,因为ip地址会变动 配置ip 1.master [root@master ...
- 讲课 PPT 公开啦
目前限于时间原因,只在 Github Pages 上托管了. 之后有时间会托管到 pythonanywhere 上,因为 Github Pages 是在太慢了.
- LeetCode 719. 找出第 k 小的距离对 (Java)
题目: 给定一个整数数组,返回所有数对之间的第 k 个最小距离.一对 (A, B) 的距离被定义为 A 和 B 之间的绝对差值. 示例 1: 输入:nums = [1,3,1]k = 1输出:0 解释 ...
- 剑指Offer-47.求1+2+3+...+n(C++/Java)
题目: 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 分析: 利用短路与来判断n是否大于0,从而实现递 ...