java的线程池框架及线程池的原理
作者:lqh 发布时间:2023-11-16 22:04:51
java 线程池详解
什么是线程池?
提供一组线程资源用来复用线程资源的一个池子
为什么要用线程池?
线程的资源是有限的,当处理一组业务的时候,我们需要不断的创建和销毁线程,大多数情况下,我们需要反复的进行大量的创建和销毁工作,这个动作对于服务器而言,也是很浪费的一种情况,这时候我们可以利用线程池来复用这一部分已经创建过的线程资源,避免不断的创建和销毁的动作。
线程池的原理
创建好固定数量的线程,吧线程先存下来,有任务提交的时候,把资源放到等待队列中,等待线程池中的任务队列不断的去消费处理这个队列中的任务
java的线程池原理
有5个核心的属性:最大线程数量,核心线程数量,等待队列,任务队列,拒绝策略
它的执行流程是这样的:
工作者workers数量低于核心工作者数corePoolSize时会优先创建一个工作者worker处理job,处理成功则返回。
工作者workers数量高于核心工作者数时会优先把job放入到待处理队列,放入队列成功时处理结束。
步骤2中入队失败会识别工作者数是否还小于最大工作者数maximumPoolsize,小于的话也会新创建一个工作者worker处理job。
执行拒绝策略
java的线程池框架Executor
Executor里提供了4种类型的线程池:
newCachedThreadPool
缓存型池子,先查看池中有没有以前建立的线程,如果有,就 reuse.如果没有,就建一个新的线程加入池中
缓存型池子通常用于执行一些生存期很短的异步型任务,因此在一些面向连接的daemon型SERVER中用得不多。但对于生存期短的异步任务,它是Executor的首选。
能reuse的线程,必须是timeout IDLE内的池中线程,缺省 timeout是60s,超过这个IDLE时长,线程实例将被终止及移出池。
注意,放入CachedThreadPool的线程不必担心其结束,超过TIMEOUT不活动,其会自动被终止。
newFixedThreadPool
newFixedThreadPool与cacheThreadPool差不多,也是能reuse就用,但不能随时建新的线程
其独特之处:任意时间点,最多只能有固定数目的活动线程存在,此时如果有新的线程要建立,只能放在另外的队列中等待,直到当前的线程中某个线程终止直接被移出池子
和cacheThreadPool不同,FixedThreadPool没有IDLE机制(可能也有,但既然文档没提,肯定非常长,类似依赖上层的TCP或UDP IDLE机制之类的),所以FixedThreadPool多数针对一些很稳定很固定的正规并发线程,多用于服务器
从方法的源代码看,cache池和fixed 池调用的是同一个底层 池,只不过参数不同:fixed池线程数固定,并且是0秒IDLE(无IDLE),cache池线程数支持0-Integer.MAX_VALUE(显然完全没考虑主机的资源承受能力),60秒IDLE
newScheduledThreadPool
调度型线程池
这个池子里的线程可以按schedule依次delay执行,或周期执行
SingleThreadExecutor
单例线程,任意时间池中只能有一个线程
用的是和cache池和fixed池相同的底层池,但线程数目是1-1,0秒IDLE(无IDLE)
线程池调优
一般来讲对于一个线程池没有固定的合适的参数,只有通过不断的去调整优化参数,找出最适合自己业务的参数才是最好的调优方式,但是通常来讲,线程池的初始化参数设置是有一定的公式可以借鉴的,在开始业务不是足够膨胀的时候,我们可以通过以下的公式来计算出自己的核心参数的设置。
首先我们要确认业务类型,不同的业务有不同的计算公式:
CPU密集型任务配置尽可能少的线程数量:cpu+1
IO密集型任务则由于需要等待IO操作,线程并不是一直在执行任务,则配置尽可能多的线程,如2*Ncpu。
混合型的任务,如果可以拆分,则将其拆分成一个CPU密集型任务和一个IO密集型任务,只要这两个任务执行的时间相差不是太大,那么分解后执行的吞吐率要高于串行执行的吞吐率,如果这两个任务执行时间相差太大,则没必要进行分解。我们可以通过Runtime.getRuntime().availableProcessors()方法获得当前设备的CPU个数。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
来源:http://blog.csdn.net/qq_35101189/article/details/62898768


猜你喜欢
- springboot pom文件project报错问题如下 解决方案情况1:maven版本要和课程保持一致,网盘直接下载。情况2:
- 起因曾经用过西门子出的 * , 好处是直接有SDK开发包, 不会硬件开发也能直接使用缺点也是明显的, 就是只支持Windows系统, 另外就
- Json格式在后台服务中的重要性就不多说了,直入正题。首先引入pom文件,这里使用的是1.2.83版本<dependency>
- 系列文章已完成,目录如下:commons-logging与jdk-logging、log4j1、log4j2、logback的集成原理slf
- 本文实例完成人机猜拳互动游戏的开发,供大家参考,具体内容如下阶段一:实验——分析业务,创建用户类1.分析业务,抽象出类、类的特征和行为2.创
- 概述ConcurrentHashMap(CHM)是日常开发中使用频率非常高的一种数据结构,想对于普通的HashMap,CHM提供了线程安全的
- 游戏音效就是我们在玩游戏时出现的音乐,这个也是每个游戏必备的一部分,但有是你做游戏的背景音乐有间断的感觉的话,我们可以用getCurrent
- 因项目集成了Redis缓存部分数据,需要在程序启动时将数据加载到Redis中,即初始化数据到Redis。在SpringBoot项目下,即在容
- Dockerfile 构建java web 环境Dockfile 介绍:Dockfile是一种被Docker程序解释的脚本,Dockerfi
- 注:代码已托管在GitHub上,地址是:https://github.com/Damaer/Mybatis-Learning ,项目是myb
- 一、简介Mutex的突出特点是可以跨应用程序域边界对资源进行独占访问,即可以用于同步不同进程中的线程,这种功能当然这是以牺牲更多的系统资源为
- 本文实例讲述了基于WebClient实现Http协议的Post与Get对网站进行模拟登陆和浏览的方法。分享给大家供大家参考。具体分析如下:一
- 一、demo简介1.效果展示如下图,我截了三个瞬间,但其实这是一个连续的动画,就是这个大圆不停地吞下小圆。2.这个动画可以拆分为两部分,首先
- 本文实例讲述了C#使用listView增删操作的方法。分享给大家供大家参考。具体分析如下:应用场景: C#中使用listView控件,实现动
- 一、DataSource首先大家要清楚DataSource属于MyBatis三层架构设计的基础层 然后我们来看看具体的实现。在数据持久层中
- 手机或照机拍摄的照片名称通常是”IMG_001.JPG”这种格式,这种文件名称是无意义的。使用照片拍摄时间命名可以让我们在多年以后查找照片时
- 实例如下:public string unicodetogb(string text) { &nbs
- 指针的概念:指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指
- 场景随着移动支付的兴起,在我们的app'中,会经常有集成支付的需求.这时候一般都会采用微信和支付宝的sdk 来集成(一)支付宝支付在
- 本文实例讲述了Java数组高级算法与Arrays类常见操作。分享给大家供大家参考,具体如下:冒泡排序冒泡排序原理冒泡排序代码:package