线程池详解

news2024/11/18 13:40:10

一、概念

1、线程池管理器:用于创建并管理线程池,包括创建线程池,销毁线程池,添加新任务;

2、工作线程:线程池中线程,可以循环的执行任务,在没有任务时处于等待状态;

3、任务接口:每个任务必须实现的接口,以供工作线程调度任务的执行,它主要规定了任务的入口,任务执行完后的收尾工作,任务的执行状态等;

4、任务队列:用于存放没有处理的任务。提供一种缓冲机制。

Executor是一个接口,它是Executor框架的基础,它将任务的提交与任务的执行分离开来。

ExecutorService接口继承了Executor,在其上做了一些shutdown()、submit()的扩展,可以说是真正的线程池接口;

AbstractExecutorService抽象类实现了ExecutorService接口中的大部分方法;

ThreadPoolExecutor是线程池的核心实现类,用来执行被提交的任务。

ScheduledExecutorService接口继承了ExecutorService接口,提供了带"周期执行"功能ExecutorService;

ScheduledThreadPoolExecutor是一个实现类,可以在给定的延迟后运行命令,或者定期执行命令。ScheduledThreadPoolExecutor比Timer更灵活,功能更强大。

Future接口和实现Future接口的FutureTask类,代表异步计算的结果。

Runnable接口和Callable接口的实现类,都可以被ThreadPoolExecutor或Scheduled-ThreadPoolExecutor执行。

ThreadPoolExecutor构造函数各参数含义

1、corePoolSize

线程池中的核心线程数,当提交一个任务时,线程池创建一个新线程执行任务,直到当前线程数等于corePoolSize;

如果当前线程数为corePoolSize,继续提交的任务被保存到阻塞队列中,等待被执行;

如果执行了线程池的prestartAllCoreThreads()方法,线程池会提前创建并启动所有核心线程。

2、maximumPoolSize

线程池中允许的最大线程数。如果当前阻塞队列满了,且继续提交任务,则创建新的线程执行任务,前提是当前线程数小于maximumPoolSize

3、keepAliveTime

线程空闲时的存活时间,即当线程没有任务执行时,继续存活的时间。默认情况下,该参数只在线程数大于corePoolSize时才有用

4、TimeUnit

keepAliveTime的时间单位

5、workQueue

workQueue必须是BlockingQueue阻塞队列。当线程池中的线程数超过它的corePoolSize的时候,线程会进入阻塞队列进行阻塞等待。通过workQueue,线程池实现了阻塞功能

6、ThreadFactory

创建线程的工厂类,不传有默认工厂Executors.defaultThreadFactory()

Executors工具类

ThreadPoolExecutor通常使用工厂类Executors来创建。Executors可以创建4种类型的ThreadPoolExecutor:SingleThreadExecutor、FixedThreadPool 和 CachedThreadPool,scheduledThreadPool。

你可以自己实例化线程池,也可以用Executors 创建线程池的工厂类,常用方法如下:

newFixedThreadPool(int nThreads) 创建一个固定大小、任务队列容量无界的线程池。核心线程数=最大线程数。

适用于为了满足资源管理的需求,而需要限制当前线程数量的应用场景,适用于负载比较重的服务器。

FixedThreadPool使用无界队列LinkedBlockingQueue作为线程池的工作队列(队列的容量为Integer.MAX_VALUE)。

newCachedThreadPool() 创建的是一个大小无界的缓冲线程池。它的任务队列是一个同步队列。任务加入到池中,如果池中有空闲线程,则用空闲线程执行,如无则创建新线程执行。池中的线程空闲超过60秒,将被销毁释放。线程数随任务的多少变化。适用于执行耗时较小的异步任务。池的核心线程数=0 ,最大线程数= Integer.MAX_VALUE。

newSingleThreadExecutor() 只有一个线程来执行无界任务队列的单一线程池。该线程池确保任务按加入的顺序一个一个依次执行。当唯一的线程因任务异常中止时,将创建一个新的线程来继续执行后续的任务。与newFixedThreadPool(1)的区别在于,单一线程池的池大小在newSingleThreadExecutor方法中硬编码,不能再改变的。

newScheduledThreadPool(int corePoolSize) 能定时执行任务的线程池。该池的核心线程数由参数指定,最大线程数=Integer.MAX_VALUE。详情看全文的第三大点ScheduledExecutorService接口。

FixedThreadPool和SingleThreadExecutor使用无界队列LinkedBlockingQueue作为线程池的工作队列。CachedThreadPool使用没有容量的SynchronousQueue作为线程池的工作队列,但CachedThreadPool的maximumPool是无界的。这意味着,如果主线程提交任务的速度高于maximumPool中线程处理任务的速度时,CachedThreadPool会不断创建新线程。极端情况下,CachedThreadPool会因为创建过多线程而耗尽CPU和内存资源。

任务execute过程

是否达到核心线程数量?没达到,创建一个工作线程来执行任务。

工作队列是否已满?没满,则将新提交的任务存储在工作队列里。

是否达到线程池最大数量?没达到,则创建一个新的工作线程来执行任务。

最后,执行拒绝策略来处理这个任务。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/63147.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python 采集87个手绘风格PPT模板

源码下载链接:ppt.rar - 蓝奏云 PPT下载链接:https://pan.baidu.com/s/1HUAEe_-4IEV6ttOKC_VPuA?pwd96px 提取码:96px 采集的参数 page_count 1 # 每个栏目开始业务content"text/html; charsetgb2312"base_url "https:…

网络层之IP协议(必备知识)

文章目录1、IP协议头格式2、IP分片与组装4、IP基础知识<1>IP地址属于网络层地址<4>IP地址<2>路由控制<3>IP属于面型无连接型4、其他重要协议或技术<1>ICMP协议TCP/IP的心脏是互联网。这一层主要由IP(Internet Protocal) 和ICMP(Internet Control…

短视频内容创作:内容发给谁?为什么发?发什么?以什么形式发?

一句话介绍短视频内容定位&#xff0c;我赢助手每周一课短视频运营关键节点介绍。 内容定位无非就是视频发给谁?为什么发?以什么形式发&#xff1f; 短视频发给谁&#xff1f;就是做好你的目标受众的细分。 商业定位我们之前聊过了&#xff0c;如果你看过之前的内容&#x…

双十二护眼灯牌子买什么的好?几款比较好的学生护眼灯推荐

双十二即将来临&#xff0c;相信很多小伙伴们也开始着手选择比较喜欢的东西了吧&#xff0c;那对于学生来讲&#xff0c;护眼台灯也是一个不可忽视的好东西。 现在的学习压力这么大&#xff0c;用眼过于频繁&#xff0c;所以很多学生孩子眼睛就很容易近视&#xff0c;小小年纪就…

MATLAB实现希尔伯特变换以及FFT补零分析

南京信息工程大学 实验&#xff08;实习&#xff09;报告 实验&#xff08;实习&#xff09;名称 数字信号处理 实验&#xff08;实习&#xff09;日期 得分 指导老师 学院 电信院 专业 电子信息工程 年级 2020 班次 …

从vue2到vue3,生命周期函数有何变化之详解

vue2与vue3生命周期的对比&#xff1a; Vue2--------------Vue3 beforeCreate—————–>setup() created————————>setup() beforeMount—————–>onBeforeMount mounted—————-------> onMounted beforeUpdate -————–> onBeforeUpdate u…

正则表达式入门级别详细教程

文章目录常用正则表表达式01、火车车次02、手机机身码(IMEI)03、必须带端口号的网址(或ip)04、网址(URL)05、统一社会信用代码06、迅雷/ed2k/磁力链接07、子网掩码(不包含 0.0.0.0)08、Linux/windows文件路径09、股票代码(A股)10、大于等于0, 小于等于150, 支持小数位出现5, 如…

手把手教你编写Python抢购脚本

想买苹果手机&#xff0c;但总是抢不到&#xff0c;所以想试着能不能写个脚本代码。 第一步&#xff1a;把想要抢购的商品加进购物车&#xff0c;注意&#xff1a;脚本是对购物车内全部商品进行下单操作&#xff0c;所以不够买的商品最好先从购物车内删除。 第二步&#xff1a…

网络安全这玩意儿真不建议一般人学...

前言 作为一名5年网安工程师老菜鸟来说&#xff0c;我实在想不通&#xff0c;开发岗位那么多&#xff0c;为什么要来学网安? 在这里怕是要给准备入坑的同学泼盆冷水了&#xff0c;网络安全这东西真不建议一般人学... 基础确实很简单&#xff0c;是个人稍微认点真都能懂&…

20221205英语学习

今日新词&#xff1a; abort v.中止, 流产, 放弃, 堕胎 motor adj.有引擎的, 由发动机推动的, 机动车的, 汽车的 flag n.旗, 标志旗, 菖蒲, 旗帜&#xff08;指某国家或组织及其信仰和价值观&#xff09; August n.八月 division n.&#xff08;主要&#xff09;部门&…

数据可视化之疫情可视化

一 前言 新型冠状病毒肺炎&#xff08;COVID-19&#xff0c;简称“新冠肺炎”&#xff09;疫情肆虐全球多个国家&#xff0c;2020年3月11日&#xff0c;世界卫生组织 (WHO) 正式宣布将新冠肺炎列为全球性大流行病。 在全球抗击新型冠状病毒疫情的过程中&#xff0c;产生了前所…

网络管理——直接网络管理规范

逻辑环 逻辑环机制 每个逻辑节点都有一个逻辑地址&#xff0c;且每个节点有一个后继节点&#xff0c;从而建立一个逻辑环。后继节点定义为&#xff1a;按照NM 地址段节点地址大小排列&#xff0c;小地址节点→大地址节点依次传递网络管理报文&#xff1b;最大地址节点→最小地…

【IoT】产品经理:如何了解行业需求、痛点和发展机会?

需求、痛点、发展机会是跟你所处行业的密切相关的&#xff0c;只有融入这个行业&#xff0c;才能更好地理解需求和痛点。 1、避免一叶障目 你需要做到避免只见树木不见森林&#xff0c;避免自己局限于细节而忽视了全局。 我们对部分的理解再深刻&#xff0c;也无法得到对整体的…

年薪90万男子嫌无聊起诉公司?用任务软件飞项充实工作吧!

每天正常上下班&#xff0c;毫无工作压力&#xff0c;这样的神仙工作是不是你期望的&#xff1f;但最近有个奇葩的新闻引起了网友的热议。就是这样的工作&#xff0c;但“身在福中不知福”的男子米尔斯&#xff0c;却将公司给起诉了&#xff0c;理由是“太无聊”。据报道&#…

SpringCloud框架(二):整合Eureka作为注册中心、Feign进行远程调用、Ribbon实现负载均衡,底层源码解读

环境搭建 生产和消费 RestTemplate&#xff0c;底层源码解读SpringCloud环境搭建&#xff1a;生产和消费 RestTemplate整合Eureka和Feign引入Eureka服务注解中心替代RestTemplate&#xff1f;通过openFegin进行调用当一个请求多次落到一个服务上&#xff0c;其他服务如何平衡这…

【Python项目】毕业设计必备——Python实现一个GUI版本的学生信息管理系统 | 附源码

前言 halo&#xff0c;包子们上午好 很多学计算机的小伙伴应该都知道&#xff0c;毕业设计是一个头疼的东西 今天的话小编这边给大家准备好了一个Python版本的毕业设计课题——学生管理系统 说实话操作起来还是有那么一点点的难度的&#xff0c;但是大家不用担心 作为一个宠粉…

SSM框架学习记录-Spring_day02

1.IOC/DI配置管理第三方bean 之前都是基于自己写的类&#xff0c;如果有需求去管理第三方Jar包中的类&#xff0c;该如何管理? 案例:数据源对象管理 使用Spring的IOC容器来管理Druid连接池对象 思路分析 要使用第三方的技术&#xff0c;需要在pom.xml添加依赖 在配置文件中将…

CloudKit教程之如何从 CloudKit 获取图像资源到 SwiftUI 应用程序

最近,我研究了 CloudKit API 文档,并尝试将数据库和资产集成到我的应用程序中。这是我的一些发现,希望对您有所帮助…… 想要从 iCloud 公共数据库获取图像资产到他们的 SwiftUI 应用程序的 Apple 开发人员而写的。 将 Sign in with Apple 集成到 CloudKit 新建 Xcode 项…

CSRF漏洞利用与防御

今天继续给大家介绍渗透测试相关知识&#xff0c;本文主要内容是CSRF漏洞利用与防御。 免责声明&#xff1a; 本文所介绍的内容仅做学习交流使用&#xff0c;严禁利用文中技术进行非法行为&#xff0c;否则造成一切严重后果自负&#xff01; 再次强调&#xff1a;严禁对未授权设…

Spring更简单的存储和读取Bean

⭐️前言⭐️ 在上一篇文章【Spring的创建与使用】中&#xff0c;我们已经了解了Spring中bean对象的基本的创建和使用方法&#xff0c;这篇文章通过注解的方法&#xff0c;使得存储和读取对象更加简单。 &#x1f349;博客主页&#xff1a; &#x1f341;【如风暖阳】&#x1…