面试典中典之线程池的七大参数
文章目录
- 一、七大元素解释
- 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更新语句时候,会给数据加上行锁,加上行锁以后,会对整张表加…...
3步解决Windows视频播放难题:LAV Filters开源解码器终极方案
3步解决Windows视频播放难题:LAV Filters开源解码器终极方案 【免费下载链接】LAVFilters LAV Filters - Open-Source DirectShow Media Splitter and Decoders 项目地址: https://gitcode.com/gh_mirrors/la/LAVFilters 你是否曾经遇到过这样的尴尬场景&…...
Llama-3.2V-11B-cot惊艳效果:将儿童涂鸦转化为含因果逻辑的故事描述
Llama-3.2V-11B-cot惊艳效果:将儿童涂鸦转化为含因果逻辑的故事描述 1. 模型能力概览 Llama-3.2V-11B-cot 是一个突破性的视觉语言模型,它能将简单的儿童涂鸦转化为包含完整因果逻辑的故事描述。这个基于LLaVA-CoT论文实现的模型,展现了令人…...
从理论到实践:基于MATLAB的ZF、ML、MRC与MMSE信号检测算法性能深度剖析
1. 信号检测算法入门:从通信系统到MATLAB实现 第一次接触信号检测算法时,我被各种缩写搞得晕头转向。直到在MIMO系统项目中真正用MATLAB实现了这些算法,才明白它们就像不同的"翻译官",负责把混乱的接收信号还原成原始信…...
别再复制粘贴了!深入理解STM32中IIR滤波器的差分方程与状态变量
从零构建STM32 IIR滤波器:差分方程、状态变量与C语言实现全解析 在嵌入式信号处理领域,IIR(无限脉冲响应)滤波器因其高效的计算特性和优异的频率选择性能,成为STM32等资源受限平台的理想选择。但许多开发者仅仅停留在&…...
Fish Speech 1.5语音克隆5分钟快速部署:零基础小白也能玩转AI配音
Fish Speech 1.5语音克隆5分钟快速部署:零基础小白也能玩转AI配音 1. 认识Fish Speech 1.5语音克隆技术 Fish Speech 1.5是当前最易上手的开源语音克隆工具之一。想象一下,你只需要录制10秒钟的语音样本,就能让AI用你的声音朗读任何文本——…...
实测cv_resnet18_ocr-detection:电商截图、票据文字识别效果超预期
实测cv_resnet18_ocr-detection:电商截图、票据文字识别效果超预期 1. 开箱即用的OCR文字检测体验 当我第一次打开cv_resnet18_ocr-detection的WebUI界面时,紫蓝渐变的现代化设计立刻吸引了我的注意。这个由科哥开发的OCR文字检测模型,承诺…...
从零开发Shell补全脚本:学习git-flow-completion的代码架构
从零开发Shell补全脚本:学习git-flow-completion的代码架构 【免费下载链接】git-flow-completion Bash, Zsh and fish completion support for git-flow. 项目地址: https://gitcode.com/gh_mirrors/gi/git-flow-completion 掌握Shell补全脚本开发是提升命令…...
Windows下OpenClaw安装避坑:Qwen3.5-9B模型接入全记录
Windows下OpenClaw安装避坑:Qwen3.5-9B模型接入全记录 1. 为什么选择OpenClawQwen3.5-9B组合 去年12月我在整理年度技术文档时,被重复的文件归类操作折磨得苦不堪言。当时尝试过用Python脚本自动化处理,但面对动态变化的文件命名规则总是力…...
大数据可视化
1. 传播分析评估维度:包含认知(知晓、记忆)、行动(点击、搜索)、情感(喜好、美誉)三个层面传统评估:主要关注广告点击率和观看次数等表面指标深度评估:需要分析广告观看后…...
双模型协作方案:OpenClaw同时接入Phi-3-vision-128k-instruct与Qwen的配置技巧
双模型协作方案:OpenClaw同时接入Phi-3-vision-128k-instruct与Qwen的配置技巧 1. 为什么需要双模型协作? 去年我在搭建个人自动化助手时,发现单一模型很难兼顾所有任务场景。当我尝试用纯文本模型处理截图中的表格数据时,识别准…...
