你的Java项目还在等待吗?快来学会线程池,解放你的性能!
文章目录
- 你的Java项目还在等待吗?快来学会线程池,解放你的性能!
- 1 什么是线程池?为什么需要它?
- 2 线程池的参数有哪些?
- 3 不同类型的线程池有哪些配置?
你的Java项目还在等待吗?快来学会线程池,解放你的性能!
近期迷上了举例子来结合知识点学习,尽量减少枯燥,如有错见谅哈~
1 什么是线程池?为什么需要它?
线程池是什么?
线程池是一个高效的并发处理工具,它类似于你家里的管家,可以有效地管理和调度工作任务(线程)。
想象一下,你有很多家务要做,比如洗衣服、做饭、打扫等,如果每件事情都一个人去做,可能效率不高,而且容易混乱。但如果有一个管家可以根据不同的情况安排人手,就会更有条理和高效。
在Java项目开发中,线程池的作用就类似于这个管家:它提前创建好一批线程(类似于家里的工人),这些线程随时待命,等待分配任务。当有任务需要处理时,不需要每次都创建新的线程(雇新工人),而是从线程池中取出一个空闲的线程(已有的工人),分配任务给它执行,执行完毕后该线程可以被复用,而不是立即销毁。
在代码层面,一个简单的线程池的创建可以像这样:
// 创建了一个固定大小为10的线程池
ExecutorService executor = Executors.newFixedThreadPool(10);
为什么需要它?
这种预先创建并重复利用线程的方式,极大地节省了线程创建和销毁的开销,同时避免了系统因为线程过多而导致资源耗尽或性能下降的问题。
通过合理配置线程池的大小和参数,可以更好地控制并发执行的线程数量,从而优化系统的性能和响应速度。
2 线程池的参数有哪些?
线程池的参数主要是用来配置它如何管理和调度线程的。
想象一下,你在为一个派对准备,你需要决定几个桌子和椅子,以及每个桌子上坐几个人。这些参数决定了整个派对的布置和效率。
核心池大小(corePoolSize),指定了线程池中始终保持活动状态的线程数。即使没有任务执行,这些线程也会被保留。
就像派对上至少需要几个人来保证基本的服务,这些线程会一直存在,即使没有任务可做。
// 设置核心池大小为5
int corePoolSize = 5;
最大池大小(maximumPoolSize),定义了线程池中允许的最大线程数。当队列满了且线程池中的线程数小于最大池大小时,新任务会创建新线程执行。
相当于在派对上,你愿意容忍的最多人数。如果任务多,就会雇佣更多的人来处理。
// 设置最大池大小为10
int maximumPoolSize = 10;
任务队列(workQueue),用来保存等待执行的任务。常见的队列包括有界队列和无界队列和先进先出队列(FIFO)和优先级队列,它们影响着任务的排队策略。
就像派对上的等候区,这里存放着还没坐下的客人。
// 使用有界队列,最大容量为100
BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>(100);
线程存活时间(keepAliveTime),定义了线程空闲多久后被销毁。这个参数只有在线程池的线程数大于核心池大小时才会生效。
就像派对上的工作人员,如果长时间没事做,会被安排离开。
// 线程空闲时间为60秒
long keepAliveTime = 60;
// 时间单位为秒
TimeUnit unit = TimeUnit.SECONDS;
拒绝策略(rejectedExecutionHandler),决定了当任务无法加入线程池时的处理方式。例如,可以选择直接抛出异常或者在调用者线程中执行任务。
就像派对上人满为患,需要安排后面来的客人去别的场地。
// 默认的拒绝策略,抛出异常
RejectedExecutionHandler handler = new ThreadPoolExecutor.AbortPolicy();
通过合理配置这些参数,可以根据应用程序的需求和系统的负载来优化线程池的性能和资源利用率。
例如,在处理大量短时任务的场景中,可以增加核心池大小和任务队列的容量,以提高响应速度和任务处理的并发性。
3 不同类型的线程池有哪些配置?
线程池根据不同的场景和需求提供了灵活的配置选项,通过合理地选择和配置,可以最大化地利用系统资源,提高任务执行的效率和响应速度。
固定大小线程池(FixedThreadPool),有固定数量的线程,不会根据任务数量的增减而调整。适合于任务数量已知且需要快速执行的情况。
像在派对中设置几张大小固定的桌子和椅子,每张桌子上有固定数量的座位。每个人都有固定的位置,确保派对期间座位不会超出预期。
// 创建一个固定大小为5的线程池
ExecutorService executor = Executors.newFixedThreadPool(5);
缓存线程池(CachedThreadPool),会根据需要创建新的线程,而且在线程空闲一段时间后会回收,适合处理大量短期异步任务。
桌子和椅子根据人数的需要动态增加或减少,以适应派对规模的变化。
// 创建一个根据需求自动调整大小的线程池
ExecutorService executor = Executors.newCachedThreadPool();
单线程化线程池(SingleThreadExecutor),只有一个工作线程,适合需要顺序执行任务的场景,保证任务按照提交的顺序执行。
所有的客人(任务)一个接一个地坐在这张桌子旁边,确保每个任务按顺序执行。
// 创建一个只有一个线程的线程池
ExecutorService executor = Executors.newSingleThreadExecutor();
定时执行线程池(ScheduledThreadPool),可以延时或定期执行任务,比如每隔一段时间执行一次任务或者延迟一段时间后执行。
就像在派对中设置了几张定时餐桌,每张桌子预定在特定的时间供特定数量的人坐下。
// 创建一个具有固定大小为3的定时执行线程池
ScheduledExecutorService executor = Executors.newScheduledThreadPool(3);
工作窃取线程池(ForkJoinPool),是一种特殊的线程池,适用于并行任务的处理,每个线程都有自己的工作队列,能够高效处理递归划分的任务。
// 创建一个工作窃取线程池
ForkJoinPool executor = new ForkJoinPool();
每一天都是起跑线,勇敢迈出第一步
相关文章:

你的Java项目还在等待吗?快来学会线程池,解放你的性能!
文章目录 你的Java项目还在等待吗?快来学会线程池,解放你的性能!1 什么是线程池?为什么需要它?2 线程池的参数有哪些?3 不同类型的线程池有哪些配置? 你的Java项目还在等待吗?快来学…...

深入解析:Amazon Bedrock 上 Claude 3 Haiku 的微调测试报告
前言 2024年7月10日,Anthropic Claude 3 Haiku 的微调功能在 Amazon Bedrock 上开放预览。本篇文章将分享 Claude 3 Haiku 的微调使用步骤及微调后模型的评估结果。 LLM 细调的优势 通过细调,LLM可以获得特定领域的知识或新知识。这样,与RA…...
2023年庐阳区青少年信息学科普日真题- 马拉松(marathon)
题目描述 环湖马拉松全程 L 公里,已经安排了 N 个补给点,位置已经确定。由于预算增加,现在可以增设 K 个补给点。如何安排新增的补给点使得相邻补给点间最大距离最小。相邻补给点间距离也包括起点与第一个补给点之间的距离和最后一个补给点与…...
Python笔记:socket.gaierror: [Errno -3] Temporary failure in name resolution
【Python】成功解决socket.gaierror: [Errno -3] Temporary failure in name resolution 在Python开发中,使用网络编程时,特别是处理socket连接时,遇到socket.gaierror: [Errno -3] Temporary failure in name resolution这个错误是一个相对…...

HexView 刷写文件脚本处理工具-基本功能介绍(三)-导出S19/HEX
菜单 导出(Export) 此项目将一系列不同的选项组合在一起,用于将内部数据存储为不同的文件格式。每种导出都可以包含一些选项,以调整输出信息。 导出为S-Record格式(Export as S-Record) Motorola S-Record格式导出数据。 记录类型将根据最高地址信息的长度自动选择。…...

代码随想录算法训练营第四天(二)|面试题 02.07. 链表相交 142.环形链表II
面试题 02.07. 链表相交 题目: 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。 图示两个链表在节点 c1 开始相交: 题目数据 保证 整个链式结构中不存在环…...
学习记录第二十一天
目录操作是指在计算机文件系统中对目录(也称为文件夹)进行的各种管理操作。目录是组织和存储文件的一种逻辑结构,它帮助用户和系统管理大量文件,使得文件查找和组织更加高效有序。目录操作主要包括以下几种: 1.创建目…...

江协科技51单片机学习- p31 LCD1602液晶屏驱动
🚀write in front🚀 🔎大家好,我是黄桃罐头,希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🎁欢迎各位→点赞👍 收藏⭐️ 留言📝…...
Android SurfaceFlinger——渲染完成帧显示(四十八)
帧渲染完成后下一步就是将帧缓冲区(framebuffer)的内容发送到显示设备进行显示,也是 SurfaceFlinger 处理渲染合成的最后一步。 1.更新输出设备的色彩配置文件2.更新与合成相关的状态3.计划合成帧图层4.写入合成状态5.设置颜色矩阵6.开始帧7.准备帧数据以进行显示(异步方式)…...

ABAP+json格式数据转换时参数为空没传值
CALL METHOD /UI2/CL_JSON>SERIALIZE 我们在ABAP传输json格式数据到外围系统时,会用到这个类方法 /UI2/CL_JSON>SERIALIZE CALL METHOD /UI2/CL_JSON>SERIALIZEEXPORTINGDATA LO_DATACOMPRESS XPRETTY_NAME /UI2/CL_JSON>PRETTY_M…...

Flink中上游DataStream到下游DataStream的内置分区策略及自定义分区策略
目录 全局分区器GlobalPartitioner 广播分区器BroadcastPartitioner 哈希分区器BinaryHashPartitioner 轮询分区器RebalancePartitioner 重缩放分区器RescalePartitioner 随机分区器ShufflePartitioner 转发分区器ForwardPartitioner 键组分区器KeyGroupStreamPartitio…...

谁来做引领企业精益变革的舵手最合适?
在这个瞬息万变的商业时代,企业如同航行在波涛汹涌的大海中的巨轮,既需面对未知的挑战,也要抓住稍纵即逝的机遇。而在这场没有终点的航行中,引领企业实现精益变革的舵手,无疑是推动企业破浪前行、稳健致远的关键角色。…...

数据结构(java实现)——优先级队列,堆
文章目录 优先级队列堆堆的概念堆的模拟实现创建堆入堆判满删除判空获取栈顶元素 创建堆两种方式的时间复杂度堆排序java提供的PriorityQueue类基本的属性关于PriorityQueue类的三个构造方法关于PriorityQueue类中,入堆方法是怎样实现的?PriorityQueue注…...

一部分优化算法
一、优化问题 1、优化目标 (1)优化和深度学习的目标是根本不同的。前者主要关注的是最小化目标,后者则关注在给定有限数据量的情况下寻找合适的模型。 (2)优化算法的目标函数通常是基于训练数据集的损失函数&#x…...

图论(强联通分量)
在图论中,特别是在讨论有向图(Directed Graph)时,我们常常需要了解图的结构特性,比如强联通分量(Strongly Connected Components, SCC)。了解强联通分量中的各种边对于理解图的整体结构以及某些…...

LLaMA- Adapter V2: Parameter-Efficient Visual Instruction Model
发表时间:28 Apr 2023 论文链接:https://arxiv.org/pdf/2304.15010 作者单位: Shanghai Artificial Intelligence Laboratory Motivation:如何有效地将大型语言模型 (LLM) 转换为指令追随者最近是一个流行的研究方向࿰…...

【爬虫实战】利用代理爬取Temu电商数据
引言 在行业竞争激烈、市场变化快速的跨境电商领域,数据采集可以帮助企业深入了解客户需求和行为,分析市场趋势和竞争情况,从而优化产品和服务,提高客户满意度和忠诚度。同时,数据采集可以实时跟踪库存水平和销售情况&…...

【MATLAB源码-第244期】基于MATLAB的BP神经网络语音特征信号分类,输出原信号与预测信号对比图以及预测误差和正确率。
操作环境: MATLAB 2022a 1、算法描述 BP神经网络(Back Propagation Neural Network)是一种广泛应用于模式识别和分类问题的人工神经网络。在本次语音特征信号分类任务中,我们将详细描述如何通过BP神经网络实现对四类语音信号的…...

HarmonyOS 习题(二)
1、在类Web开发范式自定义组件创建后,加入到Page组件树时,会触发以下哪一项回调。 A)Onlnit B)OnAttached C)OnLayoutReady D)OnDetached 答案:B 分析: onlnit:自定义组件初始化生命周期回调&a…...

如何搭建一个圈子社区系统?开源社交陪玩交友圈子论坛帖子系统保姆级搭建教程!
整体部署流程如下: 1.获取源码/前后端分离,前端Uniapp vue2.0 后端thinkphp6(Gitee直达) 2.服务器安装宝塔(已有宝塔请安装环境,Nginx或者Apache/ php 7.3/ mysql 5.6 ) 3.进入宝塔添加网站&…...

IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...

零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...

基于TurtleBot3在Gazebo地图实现机器人远程控制
1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...