你的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.进入宝塔添加网站&…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
10-Oracle 23 ai Vector Search 概述和参数
一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI,使用客户端或是内部自己搭建集成大模型的终端,加速与大型语言模型(LLM)的结合,同时使用检索增强生成(Retrieval Augmented Generation &#…...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
云原生安全实战:API网关Envoy的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口,负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...
高抗扰度汽车光耦合器的特性
晶台光电推出的125℃光耦合器系列产品(包括KL357NU、KL3H7U和KL817U),专为高温环境下的汽车应用设计,具备以下核心优势和技术特点: 一、技术特性分析 高温稳定性 采用先进的LED技术和优化的IC设计,确保在…...
ZYNQ学习记录FPGA(二)Verilog语言
一、Verilog简介 1.1 HDL(Hardware Description language) 在解释HDL之前,先来了解一下数字系统设计的流程:逻辑设计 -> 电路实现 -> 系统验证。 逻辑设计又称前端,在这个过程中就需要用到HDL,正文…...
CentOS 7.9安装Nginx1.24.0时报 checking for LuaJIT 2.x ... not found
Nginx1.24编译时,报LuaJIT2.x错误, configuring additional modules adding module in /www/server/nginx/src/ngx_devel_kit ngx_devel_kit was configured adding module in /www/server/nginx/src/lua_nginx_module checking for LuaJIT 2.x ... not…...
uni-app学习笔记二十七--设置底部菜单TabBar的样式
官方文档地址:uni.setTabBarItem(OBJECT) | uni-app官网 uni.setTabBarItem(OBJECT) 动态设置 tabBar 某一项的内容,通常写在项目的App.vue的onLaunch方法中,用于项目启动时立即执行 重要参数: indexnumber是tabBar 的哪一项&…...
