22、7大参数自定义线程池(核心线程数,最大核心线程数。。。拒绝策略(4种))
创始人
2024-01-25 22:19:41

7大参数自定义线程池(核心线程数,最大核心线程数。。。拒绝策略(4种))

第一步:我们首先看单例线程池的源码

 

第二步:多个固定线程的线程池源码

 

第三步:可变的线程数的线程池源码

 

开启线程池的本质(调用ThreadPoolExecutor())

进去调用的this,再往下走

 

!!!走this方法里(可以看到有7个参数)

*corePoolSize:核心线程数

*maximumPoolSize:最大核心线程池大小(是包括前面的核心线程数的。前面为2,设置为5,那么旁边就是剩3个封存着的)

*keepAliveTime:超时无人调用就会释放

*TimeUnit:超时单位

*BlockingQueue:阻塞队列

*ThreadFactory:线程工厂,创建线程的(一般不用动)

*RejectExecutionHandler:拒绝策略(有四种的)

 

 

 

分析源码:

 

因为我们这个若是用的Executors去创建线程池的话,那么可以看到这个CachedThreadPool可能会创建大量的线程(最多21亿)从而导致OOM

 

!!!7大参数模型:(这里也说下线程池的运行逻辑)

首先我们线程池里面有几个东西这样说吧,核心线程数,最大线程数(阻塞队列吗,满了才开启的),阻塞队列,拒绝策略。

  1. 我们我们有任务进来,先看下核心线程是否有空闲,若是有空闲就用空闲线程来执行2、若是核心线程数都被占用,那么就会将任务放到阻塞队列
  2. 若是阻塞队列都放满了,那么我们就使用最大线程数的线程来执行

4、若是最大线程数也满了,那就4种拒绝策略拒绝咯

 

代码操作:

 

Executors默认使用AborPolicy(不处理,抛出异常)

 

第一步:5个人进去(2个核心数处理,3个再阻塞队列里面,最大5个个核心线程数(3个在等待阻塞队列满了唤醒))

 

两个核心线程在使用

 

第二步:进去6个人(就会使用2个核心线程和,一个最大线程数里的了,(3个再阻塞队列里))

 

 

同理7个线程,就会触发线程池中4个线程数处理。

9个就会触发拒接策略了(这里是不处理,抛出异常(5+3)线程池最多容纳8个线程)

 

里面最多5个核心线程数跑,然后最多容纳8个,有一个就拒绝策略,这里是不处理抛出异常(.AbortPolicy())

 

!!!第二种拒绝策略:(CallerRunsPolicy(哪来的去哪里))这里我们是main线程创建的,所以就是main线程去处理

 

看到没有是main去处理的,滚回去让创建你的处理去(拒绝策略)5个最大核心线程+main线程

 

!!第三个拒绝策略(DisCarPolict(队列满了,丢掉任务(不处理)不会抛出异常))

 

这里看到,没有处理,也不会抛出异常

 

拒绝策略4、(DiscardOldestPolicy(队列满了,尝试和最早的线程竞争,竞争失败就不执行咯(不是直接不执行),也是不会抛出异常的(是我们DIs上面的升级版嘛)))

 

没有抛出异常,尝试和最早的线程竞争

 

 总结:

 

package org.example.threadpoolexecutor;import java.util.concurrent.*;public class TestThreadPoolSeven {public static void main(String[] args) {System.out.println(Runtime.getRuntime().availableProcessors());ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2,//核心线程是Runtime.getRuntime().availableProcessors(),//最大线程数0L,//超时多久没人调用会释放TimeUnit.MINUTES,//超时单位new LinkedBlockingDeque<>(3),//阻塞队列(大小为3)Executors.defaultThreadFactory(),//线程工厂,一般不会动//                new ThreadPoolExecutor.AbortPolicy());//超过容量,不处理抛出异常//                new ThreadPoolExecutor.CallerRunsPolicy());//超出容量,线程池不处理,返回给创建他的处理//                new ThreadPoolExecutor.DiscardPolicy());//不处理,直接丢弃。不抛异常new ThreadPoolExecutor.DiscardOldestPolicy());//不直接抛弃,而是和最早的线程竞争线程try {for (int i = 1; i <=9; i++) {threadPool.execute(()->{System.out.println(Thread.currentThread().getName()+"=>ok");});}} catch (Exception e) {throw new RuntimeException(e);} finally {threadPool.shutdown();}

相关内容

热门资讯

北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
插入行快捷键 excel添加空... 如下图所示,像这样在两行之间插入多行空白行的操作,你会几种?可能很多人都会觉得,不就是插入空行嘛,简...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
疑难件什么意思 淘宝退货为什么... 01 常见售后类型对于现在主流电商来说,通常支持的售后形式包括仅退款,退货退款,换货,补寄。用户根据...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...