多线程新手村5--线程池
1.1 线程池是什么
线程诞生的意义是因为进程的创建/销毁开销太大,所以使用线程提高代码的执行效率;那如果想要进一步提升执行效率,该怎么办呢?有一个方法是使用线程池。
首先,什么是线程池:池就是池子,那线程池顾名思义就是装满线程的池子。
其次,线程池为什么快呢?是因为线程池的执行全部是在内核态。
那又是为什么线程池的执行全部是在内核态呢?是因为线程池在使用第一个线程的时候,就提前把线程2、3、4、5.....创建好了,当想要使用它们时直接调度即可,而不涉及到线程的创建,也就不需要调用系统API,自然只需在内核态运行,这也是为什么线程池更快的原因。
线程池其实有点像谈恋爱中“养鱼”的行为,鱼塘就是我们说的线程池。当小a和小b谈恋爱时,如果谈的很专一,那么分手之后就需要用很长的时间再和下一个人接触交流,这样谈恋爱的效率就会很慢;但是如果在谈恋爱时小a还同时和小c、小d....聊天,那么分手之后小a就可以无缝衔接,效率自然提升很多。(这里只是一个例子,但是我们还是要认真谈恋爱,不能这样)。
再举个例子:
上一个例子解释了线程池为什么快,这个例子解释了为什么用户态比内核态快。
1.2 线程池怎么用
java的标准库里有线程池的具体实现。
先不说线程池的具体细节,在这里我们首先惊奇的发现,哎?为什么实例化对象没有用new,而是用了一个静态方法呢?这不合常理呐.......
前面我们已经介绍过了设计模式中的单例模式(一个类只能实例化一个对象),在这里我们介绍设计模式中的第二个模式:工厂模式
当我们实例化对象时,会自动调用类的构造方法,这里就会存在一定的局限性。
举个例子:
而使用工厂模式就可以很好的解决这个问题。我们可以单独创建一个类,类里定义很多的静态方法,调用不同的方法可以构造出不同的对象,而不同的方法我们可以使用不同的方法名来区分,这就很好的解决了上面我们说的构造函数无法重载的问题了。
这个类我们称为工厂类,工厂类里的方法就称为工厂方法。
线程池的第一种创建方法:
这里的Cashed就是cache缓存的意思,线程用完之后不着急释放,先留着以备下次使用。
此处构造出的线程池有一个特点,线程的数目能够动态适应,随着向线程池中添加任务,会自动根据情况创建线程。
线程池的第二种创建方法:
看到括号里的参数我们就能知道,这种方法创建的线程池在创建时就已经确定了线程池中的线程数量。
线程池的第三、四种创建方法:(不常用)
上述这几个方法构造的线程池,本质上都是对一个类进行的封装,ThreadPoolExecutor,这个类就相当于我们刚才说过的工厂类,而上述通过不同创建方法创建线程池,其实就是给这个类填入了不同的参数,调用了类中不同的静态方法,从而实例化出了不同的对象。
接下来我们要聊的就是具体有哪些不同的参数(重点):
1.1 corePoolSize和maximumPoolSize
corePoolSize描述了线程池中的核心线程数量,maximumPoolSize描述的是线程池中的最大线程数量,这个线程池里的线程数量是可以变化的,变化范围是[corePoolSize,maximumPoolSize]。
怎么理解“核心线程”呢?核心线程就相当于企业中的正式员工,不管最近的任务多不多,企业都不会随便辞退你,而最大线程与核心线程的差值就是企业中的临时员工,如果最近任务比较多,那就需要多几个临时员工一起工作,如果最近任务比较少,就把这些临时员工辞退,只留下正式员工。这样做的好处是:既可以满足效率的要求,又可以避免过多的效率开销。
1.2 keepAliveTime和unit
keepAliveTime是允许临时员工的最大“摸鱼时间”,unit是时间的具体单位,ms、s、min等等。
1.3 BlockingQueue<Runnable> workQueue
阻塞队列,用来存放线程池中的任务。
1.4 ThreadFactory threadFactor
工厂模式的体现,此处使用ThreadFactory作为工厂类创建线程,可以在创建线程时对线程的一些参数进行设置。
1.5 RejectedExecutionHandler handler
这是线程池中的拒绝策略,一个线程池能容纳的最大任务数量是有限的,当任务数量达到上限时,如果继续添加任务,会发生什么呢?不同的拒绝策略,会产生不同的效果。
使用线程池,需要设置线程的数量,那么设置多少合适呢?
答:这里没有标准答案,因为一个线程执行的代码主要有两类:
1、cpu密集型:代码里主要进行的是逻辑运算/逻辑判断
2、IO密集型: 代码里主要进行的是IO操作。
假设CPU的核心数是N,那么对于cpu密集型的代码,线程的数量就不能超过N,因为当线程数量为N时,就已经到达了cpu的极限,就算再添加线程,也无法提升效率了,反而会增加调度的开销;而对于IO密集型的代码,线程的数量就可以超过N,这个时候不吃CPU,一个核心可以通过调度的方式执行多个线程。
正确做法:通过实验的方法对程序进行性能测试,测试过程中尝试修改设置的线程数量,观察什么时候能达到最有效率。
相关文章:

多线程新手村5--线程池
1.1 线程池是什么 线程诞生的意义是因为进程的创建/销毁开销太大,所以使用线程提高代码的执行效率;那如果想要进一步提升执行效率,该怎么办呢?有一个方法是使用线程池。 首先,什么是线程池:池就是池子&am…...

数据库 mysql 的彻底卸载
MySQL卸载步骤如下: (1)按 winr 快捷键,在弹出的窗口输入 services.msc,打开服务列表。 (2)在服务列表中, 找到 mysql 开头的所有服务, 右键停止,终止对应的…...

Meterpreter工具使用
Meterpreter属于stage payload,在Metasploit Framework中,Meterpreter是一种后渗透工具,它 属于一种在运行过程中可通过网络进行功能扩展的动态可扩展型Payload。这种工具是基于“内存DLL注 入”理念实现的,它能够通过创建一个新进…...

第四讲 单片机STC89C52+RA8889代码移植范例(包含API接口)
本次介绍单片机STC89C52RA8889代码移植范例,该范例已将RA8889的API移植好了,下方提供下载地址。 硬件平台:89C52RA8889 采用SPI通信方式 (已测试通过) 上一讲已经阐述RA8889移植到51单片机的基本方法,本讲增加了API…...

QT 音乐播放器【一】 显示音频级别指示器
文章目录 效果图概述代码总结 效果图 概述 QMediaPlayer就不介绍了,就提供了一个用于播放音频和视频的媒体播放器 QAudioProbe 它提供了一个探针,用于监控音频流。当音频流被捕获或播放时,QAudioProbe 可以接收到音频数据。这个类在需要访问…...

【MATLAB源码-第220期】基于matlab的Massive-MIMO误码率随着接收天线变化仿真采用ZF均衡和QPSK调制。
操作环境: MATLAB 2022a 1、算法描述 1. 系统背景与目标 无线通信系统的发展极大地推动了现代通信技术的进步,从移动通信到无线局域网,甚至是物联网,均依赖于无线通信系统的高效和可靠性。在无线通信系统中,核心目…...

【前端】政务服务大数据可视化监控平台(源码+html+css+js)
👉博__主👈:米码收割机 👉技__能👈:C/Python语言 👉公众号👈:测试开发自动化【获取源码商业合作】 👉荣__誉👈:阿里云博客专家博主、5…...

【网关】工业智能网关-02
一 公司简介 保定飞凌嵌入式技术有限公司始于2006年,是一家专注嵌入式核心控制系统研发、设计和生产的高新技术企业,是国内最早专业从事嵌入式技术的企业之一。 经过十几年的发展与积累,公司拥有业内一流的软硬件研发团队,在北京…...
【C语言】动态内存管理技术文档
【C语言】动态内存管理技术文档 目录 【C语言】动态内存管理技术文档 一、内存管理基础...
低空经济的意义所在
发展低空经济对于推动经济发展、促进产业升级、降低运输成本、构建综合交通系统等方面都具有重要意义。低空经济对推动经济发展提供新动能。低空经济作为新兴产业,具有巨大的发展潜力,能够带动投资、促进消费,为经济增长注入新动力。除此之外…...

DNF手游攻略:0氪攻略,转职技巧与避坑指南!
在DNF手游的冒险旅程中,角色的转职是一次重要的成长经历。通过转职,玩家可以获得全新的技能和属性,提升自己在地下城中的战斗力。本文将为您介绍转职后的关键技巧和日常任务,帮助您更好地适应新的职业身份,成为地下城中…...
周报 | 24.5.27-24.6.2文章汇总
为了更好地整理文章和发表接下来的文章,以后每周都汇总一份周报。 周报 | 24.5.20-24.5.26文章汇总-CSDN博客 集智书童 | YOLOv10开源|清华用端到端YOLOv10在速度精度上都生吃YOLOv8和YOLOv9_yolov8 yolov10-CSDN博客 机器之心 | 清华接手,…...

【C++初阶学习】第十二弹——stack和queue的介绍和使用
C语言栈:数据结构——栈(C语言版)-CSDN博客 C语言队列:数据结构——队列(C语言版)-CSDN博客 前言: 在之前学习C语言的时候,我们已经学习过栈与队列,并学习过如何使用C语言来实现栈与队列&…...
nginx反向代理了解
文章目录 Nginx反向代理反向代理系统调优Proxy Buffer相关指令 Nginx 具有高性能的http和反向代理的web服务器,同时也是一个pop3/smtp/imap代理服务器,使用c语言编写 **Web服务器:**也叫网页服务器,web server,主要功…...

插入排序和希尔排序
目录 1.直接插入排序2.希尔排序 1.直接插入排序 基本思想: 把待排序的数据按其大小逐个插入到一个已经排好序的有序序列中,直到所有的数据插入完成为止。 当插入第i个元素时,前面的a[0],a[1],...,a[i-1]个数据已经排好序了,此时用…...

Java web应用性能分析之【java进程问题分析定位】
Java web应用性能分析之【java进程问题分析概叙】-CSDN博客 Java web应用性能分析之【java进程问题分析工具】-CSDN博客 Java web应用性能分析之【jvisualvm远程连接云服务器】-CSDN博客 由于篇幅限制、前面三篇讲了准备工作和分析小结,这里将详细操作java进程问题…...
c#控件笔记
c# PictureBox在工具箱的哪个位置 在 Visual Studio 的工具箱中,PictureBox 控件位于 “Common Controls” 部分。要找到 PictureBox,请按照以下步骤操作: 打开 Visual Studio 并加载您的项目。确保已经打开了设计器视图(即您的…...

STM32-15-DMA
STM32-01-认识单片机 STM32-02-基础知识 STM32-03-HAL库 STM32-04-时钟树 STM32-05-SYSTEM文件夹 STM32-06-GPIO STM32-07-外部中断 STM32-08-串口 STM32-09-IWDG和WWDG STM32-10-定时器 STM32-11-电容触摸按键 STM32-12-OLED模块 STM32-13-MPU STM32-14-FSMC_LCD 文章目录 STM…...

Go语言 几种常见的IO模型用法 和 netpoll与原生GoNet对比
【go基础】16.I/O模型与网络轮询器netpoller_go中的多路io复用模型-CSDN博客 字节开源的netPoll多路复用器源码解析-CSDN博客 一、几种常见的IO模型 1. 阻塞I/O (1) 解释: 用户调用如accept、read等系统调用,向内核发起I/O请求后,应用程序…...

大米cms安装支付逻辑漏洞
1.安装 下载来源:https://www.cnblogs.com/xfbk/p/17910054.html 链接:https://pan.baidu.com/s/1b-Z6RaFBZ6CsSIErY46Pyg?pwdq8qq 提取码:q8qq 注意一下配置就可以了:php5.5apachemysql5.0,主要就是数据库版本要注…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...

cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...