你的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.进入宝塔添加网站&…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?
FTP(File Transfer Protocol)本身是一个基于 TCP 的协议,理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况,主要原因包括: ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...
6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙
Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...
