Java的线程池简述

news2024/9/24 17:12:37

线程池的工作原理

线程池是为了减少频繁的创建线程和销毁线程带来的性能损耗,线程池的工作原理如下图:
在这里插入图片描述
线程池分为核心线程池,线程池的最大容量,还有等待任务的队列,提交一个任务,如果核心线程没有满,就创建一个线程,如果满了,就是会加入等待队列,如果等待队列满了,就会增加线程,如果达到最大线程数量,就会按照一些丢弃的策略进行处理。

线程池的参数有哪些?

  • corePoolsize: 线程池核心线程数量。默认情况下,线程池中线程的数量如果<=corePoolSize,那么即使这些线程外于空闲状态,那也不会被销毁。
  • maximumPoolsize: 线程池中最多可容纳的线程数量。当一个新任务交给线程池,如果此时线程池中有空闲的线程,就会直接执行,如果没有空闲的线程且当前线程池的线程数量小于corePoolsize,就会创建新的线程来执行任务,否则就会将该任务加入到阻塞队列中,如果阻塞队列满了,就会创建一个新线程,从阻塞队列头部取出一个任务来执行,并将新任务加入到阻塞队列末尾。如果当前线程池中线程的数量等于maximumPoolsize,就不会创建新线程,就会去执行拒绝策略。
  • keepAliveTime: 当线程池中线程的数量大于corePoolsize,并且某个线程的空闲时间超过了keepAliveTime,那么这个线程就会被销毁。
  • unit: 就是keepAliveTime时间的单位。
  • workQueue: 工作队列。当没有空闲的线程执行新任务时,该任务就会被放入工作队列中,等待执行。
  • threadFactory: 线程工厂。可以用来给线程取名字等等。
  • handler: 拒绝策略。当一个新任务交给线程池,如果此时线程池中有空闲的线程,就会直接执行,如果没有空闲的线程,就会将该任务加入到阻塞队列中,如果阻塞队列满了,就会创建一个新线程,从阻塞队列头部取出一个任务来执行,并将新任务加入到阻塞队列末尾。如果当前线程池中线程的数量等于maximumPoolsize,就不会创建新线程,就会去执行拒绝策略。

线程池工作队列满了有哪些拒接策略?

当线程池的任务队列满了之后,线程池会执行指定的拒绝策略来应对,常用的四种拒绝策略包括:CallerRunsPolicy、AbortPolicy、DiscardPolicy、DiscardOldestPolicy,此外,还可以通过实现RejectedExecutionHandler接囗来自定义拒绝策略。
四种预置的拒绝策略:

  • CallerunsPolicy,使用线程池的调用者所在的线程去执行被拒绝的任务,除非线程池被停止或者线程池的任务队列已有空缺。
  • AbortPolicy,直接抛出一个任务被线程池拒绝的异常
  • DiscardPolicy,不做任何处理,静默拒绝提交的任务
  • DiscardOldestPolicy,抛弃最老的任务,然后执行该任务, 自定义拒绝策略,通过实现接口可以自定义任务拒绝策略。

线程池的种类

  • ScheduledThreadPool: 可以设置定期的执行任务,它支持定时或周期性执行任务,比如每隔 10秒钟执行一次任务,我通过这个实现类设置定期执行任务的策略。
  • FixedThreadPool:它的核心线程数和最大线程数是一样的,所以可以把它看作是固定线程数的线程池,它的特点是线程池中的线程数除了初始阶段需要从 0开始增加外,之后的线程数量就是固定的,就算任务数超过线程数,线程池也不会再创建更多的线程来处理任务,而是会把超出线程处理能力的任务放到任务队列中进行等待。而且就算任务队列满了,到了本该继续增加线程数的时候,由于它的最大线程数和核心线程数是一样的,所以也无法再增加新的线程了。
  • CachedThreadPool: 可以称作可缓存线程池,它的特点在于线程数是几乎可以无限增加的(实际最大可以达到 integer.MAXVALUE,为 2^31-1,这个数非常大,所以基本不可能达到),而当线程闲置时还可以对线程进行回收。也就是说该线程池的线程数量不是固定不变的,当然它也有一个用于存储提交任务的队列,但这个队列是 SynchronousQueue,队列的容量为0,实际不存储任何任务,它只负责对任务进行中转和传递,所以效率比较高。
  • singleThreadExecutor: 它会使用唯一的线程去执行任务,原理和FixedThreadPool是一样的,只不过这里线程只有一个,如果线程在执行任务的过程中发生异常,线程池也会重新创建一个线程来执行后续的任务。这种线程池由于只有一个线程,所以非常适合用于所有任务都需要按被提交的顺序依次执行的场景,而前几种线程池不一定能够保障任务的执行顺序等于被提交的顺序,因为它们是多线程并行执行的。
  • singleThreadScheduledExecutor: 它实际和 ScheduledThreadPool线程池非常相似,它只是ScheduledThreadPool 的一个特例,内部只有一个线程。

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

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

相关文章

基于SpringBoot+Vue+MySQL的宠物寄养服务管理系统

系统背景 互联网社会的到来&#xff0c;让各行各业通过互联网实现了浴火重生的可能&#xff0c;每个行业都发现了完全可以使用互联网技术用来提高信息在内部的传递效率&#xff0c;提高管理水准。通过本次对宠物寄养服务系统的设计和开发&#xff0c;不仅能巩固已经学到的知识&…

代码随想录 刷题记录-22 动态规划(6)习题

1.300.最长递增子序列 子序列问题是动态规划解决的经典问题&#xff0c;当前下标i的递增子序列长度&#xff0c;其实和i之前的下标j的子序列长度有关系. 动规五部曲&#xff1a; 1.dp数组及下标含义 dp[i] : 从任意位置开始&#xff0c;以nums[i]元素作为结尾的所有 递增子…

Unity编辑器开发 Immediate Mode GUI (IMGUI)

1. 简介&#xff1a; IMGUI是代码驱动gui系统&#xff0c;由 OnGUI 函数驱动&#xff1a; void OnGUI() {if (GUILayout.Button("Press Me")){ Debug.Log("Hello!");} } IMGUI常用于&#xff1a; 创建 in-game debugging displays and tools&#xff1b…

Redis基础命令和事务,redis持久化和主从复制

目录 第一章、Redis数据库的下载和安装1.1&#xff09;nosql数据库和 Redis 介绍1.2&#xff09;Windows中下载安装Redis数据库1.3&#xff09;Linux中安装Redis数据库1.4&#xff09;Linux中启动redis1.5&#xff09;Linux中关闭redis 第二章、三种Redis客户端连接Redis数据库…

AI安全立法:加州新法案的争议与未来影响

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

版本管理工具 Git 的下载安装及使用

1 基本介绍 Git 是目前最流行的分布式版本控制软件 什么是分布式版本控制软件&#xff1f; 所有版本信息仓库全部同步到本地的每个用户可以在本地查看所有版本历史&#xff0c;可以离线在本地提交&#xff0c;只需在连网时 push 到相应的服务器或其他用户那里。每个用户那里…

一键翻译全球:2024年跨文化交流的得力助手

翻译工具作为沟通不不同语言桥梁上的重要使者&#xff0c;正在从古老的字典查阅到现代的机器翻译软件发展。今天&#xff0c;让我们一同探索与搜狗翻译工具相似的翻译工具们怎么带我们走进奇妙世界。 1.福晰翻译 链接直达>>https://www.foxitsoftware.cn/fanyi/ 这款多…

数字芯片中I/O单元及电源domain布局中SIPI的考虑

芯片设计的物理实施过程通常也简称为布局布线&#xff08;P&R&#xff0c;Place-and-Route&#xff09;&#xff0c;布局一般被分为布局规划&#xff08;Floorplan&#xff09;和标准单元摆放&#xff08;Place&#xff09;两个过程。而其中的布局规划是芯片后端物理实现过…

用Starbound星际边界服务器开服联机

1、登录服务器&#xff08;百度莱卡云游戏面板&#xff09; 进入控制面板后会出现正在安装的界面&#xff0c;安装大约10分钟&#xff08;如长时间处于安装中请联系我们的客服人员&#xff09; 2、连接游戏 开机后等待服务器地址下方正常运行时间的表由黄色变成灰色并且在计时…

Centos7.x安装grafana11

第一步&#xff1a;yum安装 sudo yum install -y https://dl.grafana.com/enterprise/release/grafana-enterprise-11.2.0-1.x86_64.rpm 第二步&#xff1a;改成中文 vim /etc/grafana/grafana.ini 第三步&#xff1a;启动 systemctl start grafana-server 第四步&#x…

linux文件——文件系统——学习、理解、应用软硬件链接

前言:本篇内容主要讲解文件系统的软硬件链接。 经过前两篇文件系统的文章——讲解硬件&#xff08;磁盘&#xff09;、讲解文件系统底层&#xff0c; inode&#xff0c; 我们本节内容可以很好的理解我们要讲解的内容。 并且本节内容较少&#xff0c; 友友们学习本节的时候将会比…

Linux(CentOS 7)

Linux(CentOS 7) super space : 切换输入法 ctrl alt : 级别三(大黑屏)呼出鼠标 Fn Ctrl Alt F1 : 进入图形化界面 Fn Ctrl Alt F2 : 进入控制台界面 第 1 章 Linux 入门 1.1 概述 Linux是一个操作系统(OS) 1.2 Linux 和 Windows 区别 第 2 章 VM 与 Linux 的安装…

Apache Paimon:开启实时湖仓存储新时代

Apache Paimon&#xff1a;开启实时湖仓存储新时代 前言Apache Paimon 前言 在当今数字化浪潮汹涌澎湃的时代&#xff0c;数据已成为企业最为宝贵的资产之一。如何高效地处理、存储和利用这些海量数据&#xff0c;成为了企业在激烈竞争中脱颖而出的关键。而在数据处理的广阔领…

rsyslog交叉编译(armv7、armv8、aarch64、arm32平台通用)

文章目录 1、依赖库列表2、编译建议3、编译3.1、编译libestr3.2、编译libfastjson3.3、编译zlib3.4、编译libuuid3.5、编译libgpg-error3.6、编译libgcrypt3.7、编译openssl3.8、编译curl3.9、编译rsyslog该文档描述了如何交叉编译rsyslog到arm64嵌入式平台。 1、依赖库列表 li…

openjudge- 4.6算法之贪心_8469:特殊密码锁

题目 8469:特殊密码锁 总时间限制: 1000ms 内存限制: 1024kB 描述 有一种特殊的二进制密码锁&#xff0c;由n个相连的按钮组成&#xff08;n<30&#xff09;&#xff0c;按钮有凹/凸两种状态&#xff0c;用手按按钮会改变其状态。 然而让人头疼的是&#xff0c;当你按一个…

c++140namespace和ioterm

c语言只有一个全局定义域 那么可能会调错函数&#xff0c;调 错定义域 #include"iostream" using namespace std;//iostream 没有引入标准的std,需要手工写 //如果不写using namespace 需要引入std void main() {std::cout << "using test" <<…

【web开发】Spring Boot 快速搭建Web项目(二)

Date: 2024.08.31 18:01:20 author: lijianzhan 简述&#xff1a;根据上篇原文Spring Boot 快速搭建Web项目&#xff0c;由于搭建好项目后仍然无法使用, 我们还需要先配置一下项目。 操作如下&#xff1a; 找到src/main/resources文件夹&#xff0c;在该文件夹下点击右键创建…

【我的Android进阶之旅】使用TabLayout自定义一个TitleTabView

文章目录 零、效果图一、自定义一个TitleTabView1.1 自定义属性(attrs.xml 中)1.2 自定义TitleTabView1.3 TabItem的子布局1.4 颜色值二、在 XML 中使用 `TitleTabView`2.1 布局文件(XML)2.1.1属性说明三、在 Kotlin 中使用 `TitleTabView`:零、效果图 其中Tab 2是选中的效果…

【电子数据取证】Linux软件包管理器yum和编辑器vim

文章关键词&#xff1a;电子数据取证、手机取证、安卓取证、云取证 在Linux系统中&#xff0c;我们会进行一些软件的安装以及对一些服务或软件的配置&#xff0c;这时就需要用到Linux的yum以及编辑器&#xff0c;下面我们就来看一下这两个功能。 Linux软件包管理器yum 一、什…

数学建模强化宝典(3)fminsearch

一、介绍 fminsearch 是 MATLAB 中用于寻找单变量或多变量函数局部最小值的函数&#xff0c;它不需要函数的导数信息&#xff0c;属于无导数优化方法的一种。该函数通过单纯形搜索&#xff08;simplex search&#xff09;算法来工作&#xff0c;单纯形是n维空间中的一个n1顶点的…