线程池的执行流程和配置参数总结
一、线程池的执行流程总结
- 提交线程任务;
- 如果线程池中存在空闲线程,则分配一个空闲线程给任务,执行线程任务;
- 线程池中不存在空闲线程,则线程池会判断当前线程数是否超过核心线程数(corePoolSize)
- 若未超出核心线程数,则创建一个核心线程用来执行线程任务;
- 若超出核心线程数,则线程池会检查工作队列(workQueue)是否已满
- 如果工作队列未满,则将该线程任务存入工作队列中,当线程池中出现空闲线程,从工作队列中依次取出线程任务并执行;
- 如果工作队列已满,则判断是否超出最大线程数(maximumPoolSize)
- 若当前线程池中的线程数超出最大线程数,则执行拒绝策略(defaultHandler)。
- 若当前线程池中的线程数未超出最大线程数,则创建非核心线程数来执行线程任务。
二、线程池的配置参数总结
1.核心线程数:corePoolSize
int corePoolSize
核心线程数也就是线程池的最小线程数量。
- 核心线程会一直存活,不会被回收,除非设置了核心线程超时时间;
- 在创建线程池后,默认情况下,线程池中没有任何线程,调用
excute()
方法添加一个任务。
当线程池中没有空闲线程时,查看是否超过核心线程数:
- 线程数量小于核心线程数,则马上创建新的核心线程来执行线程任务。
- 线程数量大于核心线程数,则查看工作队列是否超出。
2.最大线程数:maximumPoolSize
int maximumPoolSize
是指线程池中允许的最大线程数量。
当工作队列已满,且存活线程数超过了核心线程数时,线程池判断“存活线程数”是否超过最大线程数:
- 未超过最大线程数:创建新线程来执行该任务。
- 超过最大线程数:执行拒绝策略。
3.非核心的空闲线程的存活时间:keepAliveTime
long keepAliveTime
当线程数大于核心线程数时,空闲的线程等待新任务到达的最大时间,如果超过这个时间线程还没有需要执行的任务,该空闲线程就会销毁。
4.keepAliveTime的单位:unit
TimeUnit unit
keepAliveTime的单位,枚举类型的TimeUnit类。
5.阻塞工作队列:workQueue
BlockingQueue<Runnable> workQueue
在任务执行之前,用来存储任务的工作队列,此队列只保存由excute()
方法提交的Runnable
类型的任务。
当存活的线程数大于核心线程数,查看工作队列:
- 工作队列未满:将新的请求任务加入工作队列;
- 工作队列已满:线程池判断是否超过最大线程数。
5.1 ArrayBlockingQueue
基于数组有界阻塞队列,FIFO(先进先出)。
- capacity:队列初始化大小
- fair:表示该队列中的可重入锁是否公平,默认为false
当线程池中已经存在最大数量的线程时候,再请求新的任务,这时就会将任务加入工作队列的队尾,一旦有空闲线程,就会取出队头执行任务。
5.2 LinkedBlockingQueue
基于链表的误解阻塞队列,默认最大容量为Integer.MAX_VALUE,可认为是无限队列,FIFO(先进先出)。
指定工作队列大小,则最大线程数量的限制是有效的。
5.3 SynchronousQueue
可以将SynchronousQueue
看作是一个没有容量的阻塞队列,它严格遵循FIFO(先进先出)的原则,但特殊的是,它不会保存任何元素,而是直接在不同的线程间进行传递。
6.线程工厂:threadFactory
ThreadFactory threadFactory
用于创建一个新线程时使用的工厂,可以用来设置线程名。
没有特别声明时,使用Executors工具类提供的默认线程工Executors.defaultThreadFactory()
。
自定义线程工厂时,要实现ThreadFactory接口,重写newThread()
方法。
7.拒绝策略:handler
RejectedExecutionHandler handler
当线程池内的线程被耗尽,并且工作队列已满,对于新提交的任务,将使用拒绝策略进行处理。
7.1 AbortPolicy:丢弃线程任务,并抛出异常
没有特别声明时,使用默认的拒绝策略defaultHandler
7.2 DiscardOldestPolicy:将工作队列的对头移除,线程池重新执行该线程任务
7.3 DiscardPolicy:直接丢弃该任务
7.4 CallerRunPolicy:线程池没有关闭时,线程自己调用run方法
7.5 自定义的拒绝策略:实现RejectedExecutionHandler接口
重写void rejectedExecution(Runnable r, ThreadPoolExecutor executor)
方法
相关文章:

线程池的执行流程和配置参数总结
一、线程池的执行流程总结 提交线程任务;如果线程池中存在空闲线程,则分配一个空闲线程给任务,执行线程任务;线程池中不存在空闲线程,则线程池会判断当前线程数是否超过核心线程数(corePoolSize)…...

node-red-L3-重启指定端口的 node-red
重启指定端口 目的步骤查找正在运行的Node.js服务的进程ID(PID):停止Node.js服务:启动Node.js服务: 目的 重启指定端口的 node-red 步骤 在Linux系统中,如果你想要重启一个正在运行的Node.js服务&#x…...

(done) 使用泰勒展开证明欧拉公式
问问神奇的 GPT,how to prove euler formula? 一个答案如下:...

红队apt--邮件钓鱼
前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 免责声明: 本文仅供了解攻击方手法使用,切勿用于非授权情节 初步了解邮件基础 用途方面 这个我们应该比较熟悉,最常用于验证码接收,也有一些厂商会用这个来打广告,…...

十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式)
十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式) 文章目录 十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式)1. Spring Boot 配置 MyBatis 的详细步骤2. 最后: MyBatis 的官方文档:https://mybatis.p2hp.com/ 关于 MyBa…...

DNS协议解析
DNS协议解析 什么是DNS协议 IP地址:一长串唯一标识网络上的计算机的数字 域名:一串由点分割的字符串名字 网址包含了域名 DNS:域名解析协议 IP>域名 --反向解析 域名>IP --正向解析 域名 由ICANN管理,有级别…...
每日一题——第一百零八题
题目: 写几个函数, ①输入10个职工的姓名和职工号 ②按照职工号由小到大排列, 姓名顺序也随之调整 ③要求输入一个职工号, 用折半查找找出该职工的姓名 #include<stdio.h> #include<string.h> #define MAX_EMPOLYEES…...

使用Python免费将pdf转为docx
刚刚想将pdf转换为docx文档时,居然要收费 还好我学过编程,这不得露两手 将pdf 转换为 docx 文档 的操作步骤 我这里使用的是Python语言 (1)在终端上安装 pdf2docx 是一个 Python 库,它可以将 PDF 文件转换为 Word (…...

树莓派4B+UBUNTU20.04+静态ip+ssh配置
树莓派4B+UBUNTU20.04+静态ip+ssh配置 1.烧录Ubuntu镜像1.1选择pi 4b1.2选择ubuntu server (服务器版,无桌面)20.041.3选择sd卡1.4 点击右下角 NEXT ,编辑设置,输入密码,wifi选CN, 开启ssh1.5 烧录,依次点击“是”,等待完成2 烧录完成后装入树莓派,上电,等待系统完成配…...
C#实现指南:将文件夹与exe合并为一个exe
在软件开发过程中,有时需要将多个文件(如资源文件、配置文件等)与可执行文件(exe)打包在一起,以便于分发和部署。在C#中,我们可以利用ILMerge或Costura.Fody等工具来实现这一目标。本文将介绍如…...

linux信号 | 学习信号三步走 | 全解析信号的产生方式
前言:本节内容是信号, 主要讲解的是信号的产生。信号的产生是我们学习信号的第二个阶段。 我们已经学习过第一个阶段——信号的概念与预备知识(没有学过的友友可以查看我的前一篇文章)。 以及我们还没有学习信号的第三个阶段——信…...

C++ 刷题 使用到的一些有用的容器和函数
优先队列 c优先队列priority_queue(自定义比较函数)_c优先队列自定义比较-CSDN博客 373. 查找和最小的 K 对数字 - 力扣(LeetCode) 官方题解: class Solution { public:vector<vector<int>> kSmallestP…...
【Kubernetes】常见面试题汇总(三十四)
目录 86. K8s 每个 Pod 中有一个特殊的 Pause 容器能否去除,简述原因。 特别说明: 题目 1-68 属于【Kubernetes】的常规概念题,即 “ 汇总(一)~(二十二)” 。 题目 69-113 属于【Kuberne…...

C++标准库双向链表 list 中的insert函数实现。
CPrimer中文版(第五版): //运行时错误:迭代器表示要拷贝的范围,不能指向与目的位置相同的容器 slist.insert(slist.begin(),slist.begin(),slist.end()); 如果我们传递给insert一对迭代器,它们不能…...
华为机考练习(golang)
输入 第一行输入一个正整数N,表示整数个数。(0<N<100000) 第二行输入N个整数,整数的取值范围为[-100,100]。 第三行输入一个正整数M,M代表窗口的大小,M<100000,且M<N。 输出 窗口…...

51单片机快速入门之按键应用拓展
51单片机快速入门之按键应用拓展 LED的点动控制: 循环检测,当key 为0 时 led 亮 反之为熄灭 while(1){ if(key!1) { led0; }else { led1; } } LED的锁定控制: 当按钮按下,led取反值 while(1) { if(key!1) { led!led; } } LED的4路抢答控制: bz默认为0 !bz 取反值,循环启动…...
数据库 - MySQL的事务
目录 前言 一、事务的特性 (一)原子性 (二)一致性 (三)隔离性 (四)持久性 二、事务的控制语句 三、事务隔离级别 (一)读未提交 (二&…...

【Python机器学习】NLP信息提取——提取人物/事物关系
目录 词性标注 实体名称标准化 实体关系标准化和提取 单词模式 文本分割 断句 断句的方式 使用正则表达式进行断句 词性标注 词性(POS)标注可以使用语言模型来完成,这个语言模型包含词及其所有可能词性组成的字典。然后,该…...

vector类
一、STL库 vector 1.1 vector的介绍 vector英文意思为向量:向量是表示大小可以改变的数组的序列容器。 指向其元素的常规指针上的偏移量来访问其元素,并且与数组中的效率一样高。但与数组不同,它们的大小可以动态变化,其存储由容…...

python常见的魔术方法
什么是魔术方法 Python类的内置方法,各自有各自的特殊功能,被称之为魔术方法 常见的魔术方法有以下: __init__:构造方法 __str__:字符串方法 __lt__:小于、大于符号比较 __le__:小于等于、大于等于符合比较 __eq__:等于符合比较__init__ c…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...

用docker来安装部署freeswitch记录
今天刚才测试一个callcenter的项目,所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
Mysql8 忘记密码重置,以及问题解决
1.使用免密登录 找到配置MySQL文件,我的文件路径是/etc/mysql/my.cnf,有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...
uniapp 实现腾讯云IM群文件上传下载功能
UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中,群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS,在uniapp中实现: 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...