面试典中典之线程池的七大参数
文章目录
- 一、七大元素解释
- 1.corePoolSize(核心线程数):
- 2.maximumPoolSize(最大线程数):
- 3.keepAliveTime(线程空闲时间):
- 4.unit(时间单位):
- 5.workQueue(任务队列):
- 6.threadFactory(线程工厂):
- 7.handler(拒绝策略):
- 二、CountDownLatch扩展
一、七大元素解释
创建 ThreadPoolExecutor 对象时,可以通过参数控制线程池的大小、任务队列、线程空闲时间等
1.corePoolSize(核心线程数):
表示线程池中保持的常驻核心线程数,即使线程处于空闲状态,也不会被回收。核心线程会一直存活,除非设置了 allowCoreThreadTimeOut 参数为 true,允许核心线程在一定时间内空闲时被回收。
2.maximumPoolSize(最大线程数):
表示线程池中允许的最大线程数。当线程池中的线程数达到这个值时,后续的任务会被放入任务队列中等待执行,或者执行拒绝策略,具体取决于任务队列和拒绝策略的配置。
3.keepAliveTime(线程空闲时间):
表示当线程池中的线程数大于核心线程数时,多余的空闲线程在终止前等待新任务的最长时间。超过这个时间,多余的线程会被终止,直到线程数不超过核心线程数。
4.unit(时间单位):
表示线程空闲时间的单位,通常是秒、毫秒等。
5.workQueue(任务队列):
表示用于保存等待执行的任务的队列。线程池会根据核心线程数和任务队列来决定是否创建新的线程。常用的任务队列有 LinkedBlockingQueue、ArrayBlockingQueue、SynchronousQueue 等。
6.threadFactory(线程工厂):
表示创建新线程的工厂类,用于自定义线程的名称、优先级等属性。
7.handler(拒绝策略):
表示线程池无法执行新任务时的处理策略。当线程池的线程数达到最大线程数并且任务队列已满时,会触发拒绝策略。常用的拒绝策略有 ThreadPoolExecutor.AbortPolicy、ThreadPoolExecutor.DiscardPolicy、ThreadPoolExecutor.CallerRunsPolicy 等
package com.ccy.agriculture.test;
import java.util.concurrent.*;
/*** 文件名称(File Name):* 功能描述(Description):此模块的功能描述与大概流程说明* 数据表(Tables):表名** @Author wujiahao* 日期(Create Date):2023/7/26* 修改记录(Revision History):*/public class CustomThreadPool {public static void main(String[] args) {// 1. corePoolSize(核心线程数):5// 表示线程池中保持的常驻核心线程数为 5,即使线程处于空闲状态,也不会被回收。int corePoolSize = 5;// 2. maximumPoolSize(最大线程数):10// 表示线程池中允许的最大线程数为 10。当线程池中的线程数达到这个值时,// 后续的任务会被放入任务队列中等待执行,或者执行拒绝策略。int maximumPoolSize = 10;// 3. keepAliveTime(线程空闲时间):60// 表示当线程池中的线程数大于核心线程数时,多余的空闲线程在终止前等待新任务的最长时间为 60 秒。// 超过这个时间,多余的线程会被终止,直到线程数不超过核心线程数。long keepAliveTime = 60;// 4. unit(时间单位):TimeUnit.SECONDS// 表示线程空闲时间的单位为秒。TimeUnit unit = TimeUnit.SECONDS;// 5. workQueue(任务队列):LinkedBlockingQueue// 表示用于保存等待执行的任务的队列为 LinkedBlockingQueue。// LinkedBlockingQueue 是一个无界队列,可以保存无限数量的等待执行任务。BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>();// 6. threadFactory(线程工厂):默认的线程工厂// 不对线程工厂进行自定义,使用默认的线程工厂。// 7. handler(拒绝策略):ThreadPoolExecutor.AbortPolicy// 当线程池的线程数达到最大线程数并且任务队列已满时,采用默认的拒绝策略 AbortPolicy,// 即抛出 RejectedExecutionException 异常,拒绝新的任务执行。// 创建自定义线程池ThreadPoolExecutor threadPool = new ThreadPoolExecutor(corePoolSize, // 核心线程数maximumPoolSize, // 最大线程数keepAliveTime, // 线程空闲时间unit, // 时间单位workQueue // 任务队列);// 提交任务给线程池执行for (int i = 1; i <= 20; i++) {final int taskNumber = i;threadPool.execute(() -> {System.out.println("Task " + taskNumber +" is being executed by Thread " + Thread.currentThread().getName());});}// 关闭线程池threadPool.shutdown();}
}
这里可以打印出每个任务在哪个线程执行,不需要一个一个地等待前面的任务完成才能开始执行,可以并行执行多个任务,从而更好地利用系统资源

让主线程在控制台打印,可以发现主线程和线程池里的线程并发执行任务

二、CountDownLatch扩展
现实中很多业务会让子线程完成所有任务后再执行主线程,比如海量Excel表导入,要先分表读取数据再导入,这时要控制主线程要在最后执行任务,于是Java引入了CountDownLatch对象。

CountDownLatch定义一个初始值,主线程调用await()方法阻塞线程,然后每当子线程执行任务时调用countDown()方法,每调用一次计数值减一,当计数值为0时就可以唤醒主线程。
countDownLatch.await(2000,TimeUnit.MILLISECONDS);
打个比方就是你去餐馆点了20个菜,餐馆有5个厨师帮你做菜,每做一道菜就在订单上划掉对应的菜(减一操作),当所有菜做好了就可以进行上菜这个主线程了(不要跟我杠什么可以边做菜边上菜,我这个餐馆就是要做完所有菜才能上菜)
await()也可以加参数,以保证主线程必须执行。下面这串代码表示不管子线程任务是否执行完,2000毫秒之后就执行主线程。我遇过子线程拒绝新任务的情况,这样主线程就不会执行了。
友情提示:以上为纯八股文🤡
相关文章:
面试典中典之线程池的七大参数
文章目录 一、七大元素解释1.corePoolSize(核心线程数):2.maximumPoolSize(最大线程数):3.keepAliveTime(线程空闲时间):4.unit(时间单位)&#x…...
Maven如何创建Java web项目(纯干货版)!!!
1.创建Maven项目。 2.创建完成后会来到这个界面。 3.在src/main目录下,建立webapp / WEB-INF/web.xml文件,并在web.xml文件中写入以下内容: <?xml version"1.0" encoding"UTF-8"?> <web-app xmlns"http…...
linux进程间通信的方式及特点
1:信号 描述: 信号是linux上的一种软中断通信机制,可以向指定进程发送通知,总共有64种信号; 特点: 信号只能作为通知使用,没办法传递数据; 2:socket套接字 描述&#…...
京东的成功秘诀:找到自己独特而有效的商业模式
你知道京东为什么能够从一个卖电器的小网站发展成为中国最大的电商平台吗?如果京东一开始靠卖电器赚钱,不可能有今天,在十几年刘强东刚创业的时候,如果京东靠卖电器赚钱,你知道想当年的国美黄光裕和想当年的苏宁的张近…...
全局ip代理安全吗? 手机设置全局代理方法详解
全局IP代理并不一定是安全的,因为全局IP代理会将所有网络流量都通过代理服务器进行转发,包括敏感信息和隐私数据。如果代理服务器受到黑客攻击或存在安全漏洞,可能会导致数据泄露和其他安全问题。因此,在使用全局IP代理时…...
Clion开发Stm32之温湿度传感器(DHT11)驱动编写
前言 涵盖之前文章: Clion开发STM32之HAL库GPIO宏定义封装(最新版)Clion开发stm32之微妙延迟(采用nop指令实现)Clion开发STM32之日志模块(参考RT-Thread) DHT11驱动文件 头文件 /*******************************************************************************Copyrig…...
位操作相关的函数(C++)
目录 popcount函数 bitset类模板 __builtin_popcount函数 popcount函数 在C中,std::popcount函数是用来计算一个整数二进制表示中包含的1的个数。不过要注意,这个函数是C20标准引入的,因此在使用之前,要先确保编译器支持C20标…...
arm 函数栈回溯
大概意思就是arm每个函数开始都会将PC、LR、SP以及FP四个寄存器入栈。 下面我们看一下这四个寄存器里面保存的是什么内存 arm-linux-gnueabi-gcc unwind.c -mapcs -w -g -o unwind(需要加上-mapcs才会严格按照上面说的入栈) #include <stdio.h> …...
30个前端开发中常用的JavaScript函数
🧑💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 前言 在前端开发中通常会用到校验函数…...
基于量子同态加密的改进多方量子私有比较
摘要量子同态加密在隐私保护方面具有明显的优势。本文提出了一种改进的基于量子同态加密的多方量子私钥比较协议。首先,引入可信密钥中心,安全辅助加密密钥的分发和解密密钥的更新,同时防止恶意服务器发布虚假结果的攻击;在保证所有参与者得到…...
解决mysqld服务启动失败
原因如下: 1、进程占用 首先查看下mysql进程: ps -aux | grep mysql有进程号占用了,kill 这个进程号 再重启服务 2、所有者和所属组为mysql 查看/usr/local/MySQL/data/mysqld.pid所有者和所属组是否为mysql 原来是权限有问题,…...
【前端知识】React 基础巩固(四十)——Navigate导航
React 基础巩固(四十)——Navigate导航 一、Navigate的基本使用 新建Login页面,在Login中引入Navigate,实现点击登陆按钮跳转至/home路径下: import React, { PureComponent } from "react"; import { Navigate } from "reac…...
文件IO练习
一、用read函数完成文件大小计算 #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> int main(int argc, const char *argv[]) {int fd open("./1.tx…...
初识FreeRTOS入门,对FreeRTOS简介、任务调度、内存管理、通信机制以及IO操作,控制两个led不同频率闪烁
当代嵌入式系统的开发越来越复杂,实时性要求也越来越高。为了满足这些需求,开发者需要使用实时操作系统(RTOS),其中一个流行的选择是FreeRTOS(Free Real-Time Operating System)。本篇博客将详细…...
STM32CUBUMX配置FLASH(W25Q128)--保姆级教程
———————————————————————————————————— ⏩ 大家好哇!我是小光,嵌入式爱好者,一个想要成为系统架构师的大三学生。 ⏩最近在开发一个STM32H723ZGT6的板子,使用STM32CUBEMX做了很多驱动&#x…...
【Golang 接口自动化04】 解析接口返回JSON串
目录 前言 解析到结构体 json数据与struct字段是如何相匹配的呢? 解析到interface Go类型和JSON类型 实例代码 simpleJson 总结 资料获取方法 前言 上一次我们一起学习了如何解析接口返回的XML数据,这一次我们一起来学习JSON的解析方法。 JSO…...
EPPlus与Microsoft.Office.Interop.Excel的使用区别
文章目录 代码的使用区别EPPlus的工作原理Microsoft.Office.Interop.Excel的使用原理代码的使用区别 static void ExportToExcel(List<(string, double, double)> list, string outputFilePath){//Microsoft.Office.Interop.Excel的使用 /* Excel.Application excelAp…...
ncrack工具使用说明
介绍 网络认证破解工具。 Ncrack是用于网络身份验证破解的开源工具。 它设计为使用可适应不同网络情况的动态引擎进行高速并行破解。 Ncrack还可以针对特殊情况进行广泛的微调,尽管默认参数的通用性足以覆盖几乎所有情况。 它建立在模块化架构上,可以轻松扩展以支持其他协议…...
第二章:进程管理(处理机/CPU管理)
文章目录 2.1 进程与线程1.进程(1)进程的概念、进程的组成、进程的组织(2)进程控制块PCB(3)进程的状态与转换:五状态模型(4)进程控制(5)进程间的通信①共享存储②消息传递③管道通信(6)父进程与子进程(7)进程的内存空间2.线程 Thread(1)线程的概念(2)线程的实现方式:用户级线…...
MySQL中锁的简介——表级锁-元数据锁、意向锁
1.元数据锁 查看元数据锁 select object_type,object_scheme,object_name,lock_type,lock_duration from perfomance_scheme.metadata_locks;2.意向锁 线程A开启事务后在执行update更新语句时候,会给数据加上行锁,加上行锁以后,会对整张表加…...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...
Python学习(8) ----- Python的类与对象
Python 中的类(Class)与对象(Object)是面向对象编程(OOP)的核心。我们可以通过“类是模板,对象是实例”来理解它们的关系。 🧱 一句话理解: 类就像“图纸”,对…...
门静脉高压——表现
一、门静脉高压表现 00:01 1. 门静脉构成 00:13 组成结构:由肠系膜上静脉和脾静脉汇合构成,是肝脏血液供应的主要来源。淤血后果:门静脉淤血会同时导致脾静脉和肠系膜上静脉淤血,引发后续系列症状。 2. 脾大和脾功能亢进 00:46 …...
