【Java】并发革命:线程池

      

欢迎浏览高耳机的博客

希望我们彼此都有更好的收获

感谢三连支持!

        在当今软件开发领域,多线程编程已成为提升应用性能的核心技术。随着业务需求的增长,线程的频繁创建和销毁不仅增加了系统的开销,也影响了程序的运行效率。

        尽管线程的生命周期管理比进程更为轻量,但在高频率操作下,其效率仍然有待提高。 为了应对这一挑战,线程池技术应运而生。线程池的核心思想是复用,它将不再忙碌的线程保存起来,而不是销毁。当新任务到来时,线程池会重用这些线程,避免了频繁地进行系统级创建和销毁操作。         

        通过这种方式,线程池实现了资源的高效利用。它不仅减少了创建线程的开销,还提高了程序的响应速度。线程池就像是提前准备好的资源库,让我们能够快速地分配线程来处理任务,从而在多线程环境中实现性能的最优化。

线程池的参数介绍 

理解 ThreadPoolExecutor 构造方法的参数 

 

把创建一个线程池想象成开个公司。每个员工相当于一个线程。

  • corePoolSize:正式员工的数量。(正式员工,一旦录用,永不辞退)

  • maximumPoolSize:正式员工 + 临时工的数量。(临时工:一段时间不干活,就被辞退)

  • keepAliveTime:临时工允许的空闲时间。

  • unit:keepAliveTime 的时间单位,是秒、分钟,还是其他值。

  • workQueue:传递任务的阻塞队列。

  • threadFactory:创建线程的工厂,参与具体的创建线程工作。

  • RejectedExecutionHandler:拒绝策略,如果任务量超出公司的负荷了,接下来怎么处理。

    • AbortPolicy():超过负荷,直接抛出异常。
    • CallerRunsPolicy():调用者负责处理。
    • DiscardOldestPolicy():丢弃队列中最老的任务。

 

线程池的工作流程

线程池的工作流程大致如下:

  1. 任务提交:当一个任务被提交给线程池时,线程池会根据当前的线程数量和工作队列的状态来决定如何处理这个任务。

  2. 核心线程检查:如果当前运行的线程数量小于核心线程数,线程池会创建一个新的核心线程来执行任务。

  3. 工作队列:如果核心线程都在忙碌,新的任务会被放入工作队列中等待执行。

  4. 非核心线程检查:如果工作队列已满,且当前运行的线程数量小于最大线程数,线程池会创建一个新的非核心线程来执行任务。

  5. 拒绝策略:如果工作队列已满,且线程池中的线程数量已达到最大值,线程池会使用拒绝策略来处理新提交的任务。

  6. 任务执行:线程从工作队列中取出任务并执行。

  7. 线程复用:执行完任务的线程不会销毁,而是可以重复使用。

 

使用Executors创建常见的线程池

Java的java.util.concurrent包提供了Executors工厂类,用于创建不同类型的线程池:

newFixedThreadPool创建固定线程数的线程池
newCachedThreadPool创建线程数⽬动态增⻓的线程池
newSingleThreadExecutor创建只包含单个线程的线程池
newScheduledThreadPool设定延迟时间后执⾏命令,或者定期执⾏命令

 Executors本质上是ThreadPoolExecutor类的封装. 

//创建固定线程数的线程池import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class Demo17 {public static void main(String[] args) throws InterruptedException {ExecutorService service = Executors.newFixedThreadPool(4);for (int i = 0; i < 100; i++) {int id = 1;service.submit(() -> {Thread current = Thread.currentThread();System.out.println("hello thread " + id + "," + current.getName());});}//不要立即终止,等待任务执行一段时间Thread.sleep(2000);//终止线程池的线程service.shutdown();System.out.println("程序退出");}
}
//模拟实现线程池import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.BlockingQueue;class MyThreadPool {private BlockingQueue<Runnable> queue = new ArrayBlockingQueue<>(1000);//此处n表示创建几个线程public MyThreadPool(int n) {for (int i = 0; i < n; i++) {Thread t = new Thread(() -> {//循环队列中读取任务,while (true) {try {Runnable runnable = queue.take();runnable.run();} catch (InterruptedException e) {throw new RuntimeException(e);}}});t.start();}}//添加任务public void submit(Runnable runnable) {try {queue.put(runnable);} catch (InterruptedException e) {throw new RuntimeException(e);}}
}public class Demo15 {public static void main(String[] args) {MyThreadPool pool = new MyThreadPool(4);for (int i = 0; i < 1000; i++) {int id = i;pool.submit(() -> {System.out.println("执行任务" + id + "," + Thread.currentThread().getName());});}}
}

 

线程池的核心优势

  1. 资源利用率高:线程池通过重用已有线程,减少了线程创建和销毁的频率,从而降低了系统开销。
  2. 响应速度快:线程池中的线程处于待命状态,可以迅速响应新任务,提高了程序的响应速度。
  3. 并发控制:线程池通过控制线程数量,防止过多的线程消耗系统资源,从而避免了系统过载。
  4. 任务管理方便:线程池提供了集中管理线程的机制,简化了多线程程序的复杂性。

 

结论

        线程池是并发编程中的一项基本工具,它通过减少线程创建和销毁的开销,提高了程序的性能和稳定性。了解线程池的工作原理和参数配置,可以帮助我们更好地利用这一工具,编写出更高效、更健壮的多线程程序。在实际应用中,合理配置线程池参数,根据业务需求选择合适的线程池类型,是确保程序高效运行的关键。


 

希望这篇博客能为你理解线程池提供一些帮助。

如有不足之处请多多指出。

我是高耳机。

 

 

 

 


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1558745.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

鸿蒙开发(NEXT/API 12)【蓝牙服务开发】网络篇

概述 蓝牙技术是一种无线通信技术&#xff0c;可以在短距离内传输数据。它是由爱立信公司于1994年提出的&#xff0c;使用2.4 GHz的ISM频段&#xff0c;可以在10米左右的距离内进行通信。可以用于连接手机、耳机、音箱、键盘、鼠标、打印机等各种设备。特点是低功耗、低成本、…

面试笔记-js基础篇

1、因为在 JS 的最初版本中&#xff0c;使用的是 32 位系统&#xff0c;为了性能考虑使用低位存储了变量的类型信息&#xff0c;000 开头代表是对象&#xff0c;然而 null 表示为全零&#xff0c;所以将它错误的判断为 object 。虽然现在的内部类型判断代码已经改变了&#xff…

胤娲科技:AI评估新纪元——LightEval引领透明化与定制化浪潮

AI评估的迷雾&#xff0c;LightEval能否拨云见日&#xff1f; 想象一下&#xff0c;你是一位AI模型的开发者&#xff0c;精心打造了一个智能助手&#xff0c;却在最终评估阶段遭遇了意外的“滑铁卢”。 问题出在哪里&#xff1f;是模型本身不够聪明&#xff0c;还是评估标准太过…

迷你洗衣机实不实用?五款精良内衣洗衣机专业实测!

随着大家工作的压力越来越大&#xff0c;下了班之后只能想躺平&#xff0c;在洗完澡之后看着还需要手洗的内衣裤真的很头疼。有些小伙伴还有会攒几天再丢进去洗衣机里面一起&#xff0c;而且这样子是非常不好的&#xff0c;用过的内衣裤长时间不清洗容易滋生细菌&#xff0c;而…

数据分析-30-7万条天猫订单数据分析

文章目录 项目说明Part 11、数据说明及分析目录2、数据理解与处理3、数据分析可视化3.1 整体情况3.2 地区分析3.3 时间分析 Part 21、数据说明及分析目录2、数据理解及处理3、数据分析与可视化3.1 每日整体销售量走势3.2 谁家的化妆品卖的最好3.3 谁家的化妆品最贵 Part31、数据…

2024年还不知道如何清理c盘?最齐全的C盘清理指南!(非常详细)零基础入门到精通,收藏这一篇就够了

这段时间以来&#xff0c;我收到最多的问题还是问如何解决C盘爆满&#xff0c;那么今天就来给大家详细讲述一下该怎么给C盘“瘦身”。 我之前在文章《带你全面了解你的C盘&#xff01;并且给它“瘦身”&#xff01;》中讲到过C盘各个文件夹的作用&#xff0c;也提到过一些清理…

计算机毕业设计 基于Python的广东旅游数据分析系统的设计与实现 Python毕业设计 Python毕业设计选题 Spark 大数据【附源码+安装调试】

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

车牌检测系统源码分享

车牌检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision 研究…

骨传导耳机哪个牌子好?五大选购妙计带你精准入手优质骨传导耳机!

随着骨传导耳机市场的蓬勃发展&#xff0c;此产品凭借优秀的佩戴体验以及可降低听力损伤等优点引起了广泛的关注。然而&#xff0c;随着热度提高&#xff0c;市面上开始出现了许多品牌&#xff0c;这些品牌实力技术各不相同&#xff0c;甚至其中还有一些劣质机型&#xff0c;这…

imageJ 将多图中的同一条划线数据用曲线展示

1、导入图片&#xff0c;将所需的图片放进同一个文件夹&#xff0c;按顺序命名 2、划线 3、导出数据及画曲线 1&#xff09;得到单图的曲线上的图像数据&#xff1a;选中图片 -----> ctrl k 2&#xff09;将多张图像的同一条曲线位置的图像数据在同一数轴上画出曲线 步骤…

ChatGPT可以分析股票吗?

结合国庆前大A股市的小波牛市以及今天的股市表现&#xff0c;我从多个角度为你提供一些分析和建议&#xff1a; 一、国庆前的小波牛市分析 国庆前&#xff0c;大A股市出现了一波小幅上涨&#xff0c;市场呈现出一些积极的信号&#xff1a; 政策面利好&#xff1a;政府出台了…

张博,在压力下保持松弛的研一字节“老员工”|MarsCoders 开发者说

「MarsCoders 开发者说」是 AI 时代下各类技术栈、各种经历的开发者的故事记录&#xff0c;我们捕捉并再现他们在技术洪流中的职场蜕变与角色定位重塑&#xff0c;希望给更多开发者带来启发。 同时&#xff0c;该系列也记录了众多豆包MarsCode 用户和 AI 爱好者们的实践案例&am…

SQLite Developer使用说明

1.SQLite Developer下载 SQLite Developer官方版是SharpPlus出品的一款数据库管理工具。支持对sqlite3数据库的管理&#xff0c;能够自动完成窗口显示和执行数据库命令等多种特色。并且支持打开.db文件&#xff0c;适用于Android的开发。另外&#xff0c;使用Sqlite Developer…

如何防止源代码泄密?十种有效方法防止源代码泄密

关于深圳德信仁合信息有限公司的天锐绿盾产品&#xff0c;该产品专注于企业数据防泄漏&#xff0c;特别是源代码等核心技术资料的保护。以下是根据您提到的需求&#xff0c;即如何防止源代码泄密的十种有效方法&#xff0c;基于天锐绿盾产品的特点进行的归纳&#xff1a; 一、动…

windows11下面使用Pyinstaller打包python程序

文章目录 一、安装Python二、安装pip三、通过pip安装pyinstaller四、使用pyinstaller打包python为二进制程序参考 一、安装Python 我这里直接下载的是Python的可执行程序包&#xff0c;打开即用的版本&#xff0c; 也可以按照以下的教程安装python工具到windows上面 &#…

视频汇聚平台EasyCVR支持云端录像丨监控存储丨录像回看丨录像计划丨录像配置

EasyCVR视频汇聚融合平台&#xff0c;是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。平台以其强大的视频处理、汇聚与融合能力&#xff0c;在构建视频监控系统中展现出了独特的优势。 EasyCVR视频汇聚平台可接入传统监控行业中高清网络摄像机的RTSP…

AI 写作工具大比拼:揭秘 Claude 的神秘魅力以及如何订阅 Claude

AI 写作困境与 Claude 的惊喜表现 最近有很多朋友在吐槽 AI 写的文章不太行&#xff0c;我一看他的要求写的很清楚&#xff0c;已经把提示词都用到位了&#xff0c;例如&#xff1a;写作背景、写作要求等&#xff0c;都有具体写出来。但文章阅读起来就是欠缺点啥。 你们有没有…

海外短剧h5/app系统开源代码(支持多语言切换/国际支付/快捷登录)+快速搭建部署指南

一、出海短剧到底还能不能做&#xff1f;从供给侧来看&#xff0c;2024年短剧出海迎来大爆发&#xff0c;众多新的短剧APP入局&#xff0c;短剧内容供给量呈现爆炸性增长&#xff0c;增速远超国内市场。 尽管海外短剧的评价毁誉参半&#xff0c;但普适性文化为其顺利出海提供了…

非刚性点云配准 Non-rigid registration of two surfaces.SHREC 14 Human 数据集

非刚性点云配准关键&#xff08;红为target&#xff0c;蓝为source&#xff09; 白色为source经过非刚性配准后的效果&#xff0c;非刚性原理上是不存在刚性变换的旋转平移矩阵的。。后面有时间填坑

RK3568平台开发系列讲解(I2C篇)i2c 总线驱动介绍

🚀返回专栏总目录 文章目录 一、i2c 总线定义二、i2c 总线注册三、i2c 设备和 i2c 驱动匹配规则沉淀、分享、成长,让自己和他人都能有所收获!😄 i2c 总线驱动由芯片厂商提供,如果我们使用 ST 官方提供的 Linux 内核, i2c 总线驱动已经保存在内核中,并且默认情况下已经…