线程池的相关知识点(三大方法,七大参数,四种拒绝策略)

AWS RDS 介绍 三)创建 RDS 实例 AWS RDS 介绍 共分为 7 个部分, 其中 第 3部分重点介绍,如何创建一个RDS 实例。 三) AWS RDS 试用MySQL http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.MySQL. 阅读详情

一. 什么是线程池?

线程池就是以一个或多个线程[循环执行]多个应用逻辑的线程集合.

通俗解释就是事先准备好一些资源,有人要用,就来拿,用完还回!

二. 线程池的好处是什么?

1.降低资源的消耗,线程池中的线程是可以重用的,不用多次的创建和销毁,提高了系统的性能
2.提高响应速度
3.线程池中的队列可以管理大量的任务,任务的执行,调度,排队,丢弃等事宜都由线程池来管理,做到任务可控
4.方便管理,线程池对线程进行一些维护和管理,比如线程定时执行,线程生命周期管理,多少个线程并发,线程执行的监控等
线程复用,可以控制最大并发数,管理线

传统的编写线程:

1:新建线程,执行任务,任务完毕,线程销毁。线程的频繁新建/销毁都是由JVM管理的,非常的消耗系统性能。
2:当任务比较小时,花在创建和销毁线程上的时间会比任务执行的时间长。尤其是如果有大量的任务时,线程的大量创建和销毁,有内存溢出的风险。

三. 线程池介绍:

在这里插入图片描述
接口:
1.Executor 其内仅有execute(Runnable task);方法。
2.ExecutorService 继承Executor,对线程有更多的管理,常用的有:submit()方法、shutdown()方法等。
3.ScheduledExecutorService 继承ExecutorService,对线程又进一步的支持了定时执行的职能。

类:
1.AbstractExecutorService 默认实现了ExecutorService接口中的部分方法。
2.ThreadPoolExecutor 我们常用的类,里面的职能有:维护任务队列,维护线程组,管理线程调度,执行,监控,等。
3.ScheduledThreadPoolExecutor 里面的职能相对于父类ThreadPoolExecutor来说,多了对线程定时执行的职能。

三大方法:

//创建单个线程
ExecutorService executorService = Executors.newSingleThreadExecutor();
//创建固定大小的线程池
ExecutorService executorService = Executors.newFixedThreadPool(2);
//创建可伸缩的,遇强则强,遇弱则弱
ExecutorService executorService = Executors.newCachedThreadPool();

线程池不允许用Executors去创建,而是通过ThreadPoolExecutor方式创建,理解线程池的参数和运行规则

Executors创建的弊端:
1).FixedThreadPool和SingleThreadPool: 允许的请求队列长度为Integer.MAX_VALUE(约21亿),可能会堆积大量请求,导致OOM.
2).CachedThreadPool和ScheduledThreadPool:
允许创建线程数量为Integer.MAX_VALUE,可能会创建大量线程,导致OOM.

七大参数:

/**
* 线程池的构造函数
*/
 
public ThreadPoolExecutor(
//核心线程数    举例说明: 有编制的正式快递员员工个数
int corePoolSize,    
//最大线程数    双11了,包裹量急剧增多,正式员工忙不过来,只能新招临时工 =( 最大 - 核心 )      
int maximumPoolSize,   
 //临时工呆多久   临时工就是临时工(包裹量不多的时候会被辞退的),能呆几天    
long keepAliveTime,
 //临时工呆多久的计量单位  临时工呆多少小时,那么unit就计量单位为小时;临时工能呆多少天,unit计量单位就是天      
TimeUnit unit,  
//任务队列     需要派送的大量包裹存储的地方   
BlockingQueue<Runnable> workQueue,   
//线程工厂     
ThreadFactory threadFactory, 
//异常处理        
RejectedExecutionHandler handler)    

四种拒绝策略

  • AbortPolicy
    默认策略,不执行此任务,而且直接抛出RuntimeException。 切记execute()需要try catch,否则程序会直接退出

  • DiscardPolicy
    直接抛弃,任务不执行,空方法

  • DiscardOldestPolicy
    从队列里面抛弃head的一个任务,并再次尝试调用execute(task);

  • CallerRunsPolicy
    当前线程调用的execute(task)方法,当前线程阻塞在这里,直至task执行完毕

  • 自定义策略 (常用)自定义类实现RejectedExecutionHandler。例:可以先把任务写入文件或者数据库,以防止任务丢弃

线程池工作原理的流程图:
在这里插入图片描述

线程池工作原理描述:

1:有新任务了,尽可能的让核心线程去执行;
2:核心线程都在忙了,再来的任务就放到队列中去排队等待被执行;
3:队列中都塞满了任务,还来新任务,就临时招募非核心线程来执行刚到的新任务;
4:队列满了,核心线程/非核心线程都在忙,还来新任务,启用安全策略;
5:安全策略来处理仍源源不断到来的新任务,安全策略决定是丢弃新来的任务,还是其它处理。

四. 模拟线程池工作流程

在这里插入图片描述

1.Core核心线程有三个(1,2,3),已满
2.现加入3个人,没有空闲线程,则先进入等待区(阻塞队列)等待.
3.又来了3个人,没有空闲线程,等待区(阻塞队列也满),则创建新的线程(总线程数<max)来处理
4.现在max最大,阻塞队列也满了,接下来加入的人就会被拒绝!(四种拒绝策略)

  • (1) new ThreadPoolExecutor.AbortPolicy() //默认策略
    , 银行满了,还有人加入,不处理这个人并抛出异常 RejectExecutionException
  • (2)new ThreadPoolExecutor.CallerRunPolicy()
    //哪来的回哪去 会交给主线程处理
  • (3)new ThreadPoolExecutor.DiscardPolicy()
    //队列满了,丢掉任务,不抛出异常
  • (4)new ThreadPoolExecutor.DiscardOldestPolicy()
    //队列满了,会尝试和最早的竞争(若1号处理完了,则加入),不会抛出异常
银河麒麟V10等保加固清单:安全基线配置一篇搞定(附逐项检查表) 通过限制使用SSH直接以root身份登录,禁用公钥登录的方式加强SSH服务的安全性。更改SSH默认端口可在一定程度上防止被黑客使用大批量扫描方式攻击。通过修改SSH的配置文件限制可以使用SSH服务远程管理的主机。 阅读详情

相关推荐

数学文化赏析MOOC笔记【2023】

深圳大学UOOC课程《数学文化赏析》课程笔记

simplenthpower的博客 1753

Java面试基础篇---CG垃圾回收机制(一万字最终总结)

本文章参考学习相关文章: https://www.zhihu.com/question/21539353 https://www.cnblogs.com/dolphin0520/p/3783345.html https://blog.youkuaiyun.com/luzhensmart/article/details/81369091 https://blog.youkuaiyun.com/fsjwin/article/details/111342195?utm_medium=distribute.pc_relevant.none

jiu_mu_mu的博客 2127

【Arduino 动手做】六舵机自平衡 Rotary Stewart 平台

《Arduino六舵机自平衡Rotary Stewart平台项目》 该项目展示了一个基于Arduino的六自由度Rotary Stewart平台,通过六个舵机实现动态平衡控制。设计采用激光切割框架和TAMIYA 70171套件,提供详细组装指南和开源固件(GitHub可获取)。开发者丹·罗耶分享了3D打印文件、视频演示及运动学优化需求,强调该平台可扩展应用于游戏控制(如Kerbal Space Program)或教育领域。项目链接包含完整资源包,鼓励用户参与改进并分享创作成果。该案例体现了Arduino在机

雕爷学编程 1094

JAVA线程池详解

最全java线程池详解,看这一篇就够了...

ZHANGLIZENG的博客 1万+

华为OD机试真题 新系统 9月16号 【统计特殊数字】

华为OD新系统机试真题【统计特殊数字】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【统计特殊数字】。

qq_45776114的博客 776

uniapp - 实现苹果App打包上架App Store应用商店详细教程,详解Hbuilder打包编译ipa发布上传到苹果ios软件商店全流程,提供云打包/离线本地打包ios、申请IOS苹果证书方法

uni-app,苹果ios,苹果app,打包编译,appstore应用商店,ipa发布到软件商店,uniapp的app苹果应用商店上架,上架苹果APPStore,uniApp打包的ipa文件上传到商店,上架苹果商城,审核失败,被拒绝,UniApp打包ipa文件,上架iOSAppStore流程指南,最新详细教程最全,Hbuilder打包发布iosapp,苹果云打包上线全过程,云打包IPA并上传到商店,打包iOSipa文件后怎么发布到应用商店,苹果证书申请教程,ios证书申请,mac电脑,审核很久

🏆 前端领域优质创作者 1万+

Java笔记之线程池详解

这里是针对JDK1.8版本,使用JDK自带的线程池会出现OOM问题,中小型公司一般很难遇到,在阿里巴巴开发文档上面有明确的标识:上边我们已经分析了线程池的几个参数,这几个参数核心线程数、最大线程数、活跃时间和单位根据服务器本身的性能和程序的特性设定。但是线程工厂、决绝策略、阻塞队列又该怎么搞呢?拒绝策略其实很简单,ExecutorService构造时可以不传递拒绝策略,默认使用异常抛出的方式。阻塞队列我们搞一个定长的队列就好了,ArrayBlockingQueue(DEFAULT_SIZE)

LP'S Blog 1679

Ubuntu18.04安装VCS、Verdi、dve全套教程亲测(有成功截图)

通过下面十个步骤,我们就可以在ubuntu上使用vcs、verdi、dve等软件! 一、安装ubuntu系统,这个不在这里讲了,重点叫安装VCS、Verdi等软件 下面的过程一部分同其他网上流程一致,对其中部分进行修改。如果按照其他网上教程是不会成功的,本人亲测,下面是我试验网上不同文章的流程遇到的错误摸索后总结的流程,按照步骤保证可以成功运行,包括破解流程,使用时间不限制在2020年,可以自定义2030等等。 二、安装文件结构 –synopsys_installer #此程序用于安装下面三个程序。所以你想

QQ_778132974的博客 6365

线程池知识点

自定义线程池就需要我们自己配置最大线程数maximumPoolSize,为了高效的并发运行,当。CPU密集的意思是该任务需要大量的运算,而没有阻塞,CPU一直全速运行。务只有在真正的多核CPU上才可能得到加速(通过多线程),而在单核CPU上,无论你开几。I0密集型,即该任务需要大量的IO,即大量的阻塞。在单线程上运行I0密集型的任务会导。因为频繁的开启线程或者停止线程,线程需要从新被cpu从就绪到运行状态调度,需要发生。线程池和数据库连接池非常类似,可以统一管理和维护线程,减少没有必要的开销。

小牛童鞋 278

STM32+ESP8266+MQTT协议连接阿里云物联网平台

一、环境介绍 单片机采用:STM32F103C8T6 上网方式:采用ESP8266,也可以使用其他设备代替,只要支持TCP协议即可。比如:GSM模块、有线网卡等。 开发软件:keil5 二、实现功能 通过阿里云物联网服务器实现设备数据远程上传、下发,实现数据交互。 在当前使用的开发板上有4盏LED灯、一个蜂鸣器、4个按键。 三、阿里云物联网服务器创建步骤 说明:如果没有账号的话,先点击网页右上角,注册一个账号,并完成实名认证再继续下一步。 产品名称根据自己情况填...

6万+

把 OData V4 服务真正发布出去:事务码 /IWFND/V4_ADMIN 在 SAP S/4HANA On-Premise 里的定位与用法

本文介绍了SAP S/4HANA中的事务码/IWFND/V4_ADMIN,这是SAP Gateway管理OData V4服务的关键工具。该事务码主要负责将后端注册的OData V4服务以服务组形式发布到前端,并维护系统别名路由、测试入口和日志跳转。与OData V2不同,V4采用服务组概念以支持跨服务导航,类似商场统一管理多个专柜。文章还通过实际案例说明,未发布服务组会导致BAS等工具无法发现OData V4服务,并提供了验证服务组状态的访问路径和ABAP示例代码。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 208

线程池的常见知识点总结

线程相关知识点总结

weixin_42297061的博客 906

Modbus通信从入门到精通_2_Modbus TCP通信详解及仿真(搭建ModbusTCP仿真环境:创建虚拟PLC并进行ModbusTCP通讯;寄存器与PLC中映射关系;适合理解如何编写上位机)

LocalPort”是PLC的端口,最终的设置如下图所示:(相关的设置都可以查看帮助文档)P#DB1.DBX0.0 BYTE28是以指针形式表示的DB1的DBX0.0开始(在使用的西门子Modbus tcp的程序块中设置的“MB_HOLD_REG”输出寄存器),其有28个字节(28个字节对应14个寄存器),4001是第一个寄存器,往后数14个即可。在上面的基础上,增加一个“DB1”的“组对象”,同时将“MW0”的组对象禁止(双击组对象,“Active”取消勾选),启动之后发现无法连接。

分享学习成长历程,Winter is coming! 1万+

线程池7大参数,三大方法,四大拒绝策略

为什么要使用线程池? 线程池做的工作主要是控制运行的线程的数量,处理过程中将任务放入队列,然后再线程创建后启动这些任务如果线程的数量超过最大数量,超过数量的线程将排队等候,等其他线程执行完毕,再从队列中取出任务来执行 特点:线程复用,控制最大并发数,管理线程 一、降低资源消耗,通过重复利用已创建的线程降低线程创建和销毁造成的消耗 二、提高响应速度,当任务到达时,任务可以不需要的等到线程创建就能够立刻执行 三、提高线程的可管理性,线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源, 还会降低系统的

小喵的博客 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

线程池详解:三大方法、七大参数、四大拒绝策略

线程池是多线程编程中的核心工具,合理地使用线程池可以显著提高系统的性能和稳定性。通过本文的介绍,你应该已经掌握了线程池的三大创建方法、七大核心参数以及四大拒绝策略。在实际开发中,要具体需求手动配置线程池,避免使用Executors的默认方法,从而更好地控制线程池的行为。

秃头之旅 2180

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

线程池原理之七大参数和四种拒绝策略

一、说说线程池的底层工作原理 线程池主要处理流程解释(重要) 1、在创建了线程池后,等待提交过来的任务请求。 2、当调用execute()方法添加一个任务请求,线程池会做如下判断: 2.1 如果正在运行的线程数小于或者等于corePoolSize,那么马上会创建线程运行这个任务; 2.2 如果正在运行的线程数大于corePoolSize,那么会将这个任务放入队列; 2.3 如果这时...

lixinkuan的博客 3150

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Juc05_线程池概述、创建方式、七大参数、底层工作原理、拒绝策略

Juc05_线程池概述、创建方式、七大参数、底层工作原理、拒绝策略

所得皆惊喜 5936

牛!线程池(详解):三大方法、四种拒绝策略、七大参数

线程池(重点) 一:线程池:三大方法,七大参数,四种拒绝策略   池化技术:   01:程序的运行,本质 :占用系统的资源! 优化资源的使用! =>池化技术   02:线程池、连接池、内存池、对象池///......创建、销毁。 十分浪费资源   03:池化技术:事先准备好一些资源,有人要用,就来我这里拿,用完之后还给我。   线程池的好处:   01:降低资源的消耗   02:提高响应的速度   03:方便管理   (重点)线程复用、可以控制最大并发数、管理...

weixin_46784898的博客 377

Java线程池相关参数以及拒绝策略

为什么要使用线程池 在JavaSE中,要实现多线程的方式有多种,例如继承Thread、实现Runnable接口或者Callable接口。但是我们应该要知道,创建一个线程的开销是很大的,因为它总涉及与操作系统交互,我们知道,线程总共有三个过程,分别是创建、使用、销毁。但是在实际使用中,服务器在创建和销毁线程上花费的时间和消耗的系统资源,甚至可能要比花在实际处理实际的用户请求的时间和资源要多的多。除...

kuangsonghan的博客 1298

线程池相关知识点

线程池是什么相信大家都是知道的,所以这里就不做解释了,直接看相关知识点吧。

qq_71416673的博客 1279

java线程池拒绝策略_关于线程池的五种实现方式,七大参数,四种拒绝策略

1 池化技术之线程池什么是池化技术?简单来说就是优化资源的使用,我准备好了一些资源,有人要用就到我这里拿,用完了就还给我。而一个比较重要的的实现就是线程池。那么线程池用到了池化技术有什么好处呢?降低资源的消耗提高响应的速度方便管理也就是 线程复用、可以控制最大并发数、管理线程2 线程池的五种实现方式其实线程池我更愿意说成四种封装实现方式,一种原始实现方式。这四种封装的实现方式都是依赖于最原始的的实...

weixin_39641173的博客 278

线程池的拒绝策略相关总结分析

这些策略可以通过ThreadPoolExecutor的构造函数或setRejectedExecutionHandler方法来设置。选择哪种策略取决于具体的应用场景和需求。兄弟们,你是如何理解线程池的拒绝策略的呢?

xiaocai 952

线程池7个参数描述

所谓的线程池的 7 大参数是指,在使用 ThreadPoolExecutor 创建线程池时所设置的 7 个参数,如以下源码所示: public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,

m0_60380027的博客 1万+

【并发编程】--- 线程池七大参数+四种拒绝策略 + 如何合理配置线程数等简介

源码地址:https://github.com/nieandsun/concurrent-study.git 文章目录1 线程池七大参数2 RejectedExecutionHandler--- 四种拒绝策略(官方提供)3 threadFactory --- 线程工厂相关的注意事项4 如何自己new一个线程池 --- 简单结合了一下我们的项目5 实际工作中不允许使用Executors创建线程池的原因6 如何合理配置最大线程数 1 线程池七大参数 其实线程池的七大参数,我算一直都是比较熟悉的,因为我.

nrsc 2163

Java 线程池有哪些拒绝策略?

这是默认的拒绝策略。当任务无法执行时,线程池会抛出异常。当任务无法执行时,线程池会将任务交由提交任务的线程(调用者线程)来执行。当任务无法执行时,线程池会直接丢弃该任务,没有任何通知或异常。当任务无法执行时,线程池会丢弃队列中最旧的任务,然后将新任务加入队列。除了以上预定义的拒绝策略,还可以通过实现接口来自定义拒绝策略。Java 线程池提供了多种拒绝策略来处理任务队列已满且没有空闲线程的情况。不同的策略适用于不同的场景,开发者可以根据具体需求选择合适的策略或自定义策略。:默认策略,抛出异常。

m0_61716416的博客 1588

Java线程池原理与拒绝策略全解析 —— 参数、超时、拒绝机制一网打尽

线程池通过复用线程资源,提升并发性能。核心参数(核心线程数、最大线程数、超时时间、队列长度)决定了线程池的吞吐和稳定性。超时时间(keepAliveTime)能动态回收线程,适应业务波动。拒绝策略是高并发系统不可或缺的安全阀,必须结合业务特点选用。建议结合监控和实际负载持续优化线程池参数。配好参数,选好拒绝策略,线程池才能撑得住高并发!

IT技术学习与工作笔记分享 907
上一篇: Java并发-volatile,synchronized关键字,happends-before原则,Lock锁和CAS操作
下一篇: 进程与线程
Java-fly
博客等级 码龄9年 13粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值