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

Hypack 应用于地形测量的高级设置操作要领 Hypack 是业界公认最好的水文导航测量软件,是目前世界上应用广泛的专业测量疏浚软件。它能够接收,处理,存储和输出各种数据。Hypack支持绝大部分GPS,测深仪(国内如海鹰HY1603单波束测沙仪),多波束测深仪,旁扫声纳,涌浪补偿器,水位仪,验潮仪以及声速剖面仪。利用 Hypack 可以进行导航,单波束测量,多波束测量,旁扫测量以及疏浚实时监测等。软件界面友好,使用方便。本文简要阐述Hypack 应用于地形测量的几个重要操作要领。 阅读详情

一. 什么是线程池?

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

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

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

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号处理完了,则加入),不会抛出异常
华为OD机试双机位C卷-用户入网定期复评(C/C++/Py/Java/Js/Go) 华为OD机试(机考)双机位C卷 【用户入网定期复评】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【用户入网定期复评】。 阅读详情

相关推荐

ROS-Industrial :simple_message

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录1. 概述2. 协议(Protocol)3. HEADER解析3.1 MSG_TYPE3.2 COMM_TYPE3.3 REPLY CODE 1. 概述 Simple_Message是ROS-Industrial的一部分,定义了用于与工业机器人控制器通信的简单消息连接协议。另外还包括处理连接受限系统的处理器和管理器类。 2. 协议(Protocol) 简单消息(simplemessage)协议定义了ROS的驱动层和机器人控制器之.

flsxyw的博客 782

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

Simulink标定工作流优化:当A2L文件遇到ELF,如何用Matlab脚本打通‘最后一公里’?

本文探讨了Simulink标定工作流中A2L与ELF文件处理的自动化解决方案。通过Matlab脚本实现A2L文件智能合并与ELF文件自动匹配,解决了传统手动操作效率低下和易出错的问题,显著提升汽车ECU开发效率。重点介绍了脚本实现细节及持续集成系统集成方案。

weixin_30564785的博客 338

JAVA线程池详解

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

ZHANGLIZENG的博客 1万+

Dify + Oracle + MCP:轻松构建 RAG 应用与Oracle MCP Agent

通过一个实践案例,展示如何使用 Oracle 23ai 数据库、Dify、Oracle SQLcl MCP 从零开始构建一个功能完备的 RAG 应用,以及通过 Agent 与 SQLcl MCP Server 实现 Oracle 数据访问。

Rambo zheng的博客 2501

Python邮件自动化实战:基于imaplib和email库的高效邮件管理方案

本文详细介绍了如何使用Python的imaplib和email库实现高效邮件自动化管理。通过实战案例展示自动收取、解析邮件、下载附件等核心功能,帮助开发者快速构建企业级邮件处理系统,大幅提升工作效率。特别适合需要处理大量邮件的金融、数据分析等场景。

weixin_30500105的博客 619

Java笔记之线程池详解

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

LP'S Blog 1679

软件工程大作业——图书管理系统/图书个性化推荐与实现系统

软件工程期末大作业,图书管理系统,包含ER图、程序流程图、属性图、结构图

2401_82857325的博客 3649

线程池知识点

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

小牛童鞋 278

【研究生学术英语读写教程翻译 中国科学院大学Unit9】

Unit 9 If Humble People Make the Best Leaders,Why Do We Fall for Charismatic Narcissists? 如果谦逊的人是最好的领导者,为什么我们会爱上魅力型自恋者?

fuhanghang的博客 4102

将雷达连接到树莓派的串口

dev/ttyAMA0 是树莓派的主要 UART(用于 GPIO 引脚 8 (TXD) 和 10 (RXD))。通常,树莓派使用 GPIO 引脚 8 (TXD) 和 10 (RXD) 进行串口通信。树莓派上通常有两个串口:/dev/ttyS0 和 /dev/ttyAMA0。你需要确认雷达的 TX 和 RX 引脚,并与树莓派的对应引脚连接。VCC(电源)连接到树莓派的 3.3V 或 5V(根据雷达的要求)MR(Receive)连接到树莓派的 GPIO 8 (TXD)GND(地)连接到树莓派的 GND。

qq_45943628的博客 1467

线程池的常见知识点总结

线程相关知识点总结

weixin_42297061的博客 906

《FPGA接口与协议》专栏的说明与导航

《FPGA接口与协议》专栏的说明与导航(建议阅读)。

孤独的单刀 17万+

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

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

小喵的博客 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

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

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

秃头之旅 2180

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

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

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

lixinkuan的博客 3150

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

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、付费专栏及课程。

余额充值