当前位置: 首页 > news >正文

多线程新手村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 线程池是什么 线程诞生的意义是因为进程的创建/销毁开销太大&#xff0c;所以使用线程提高代码的执行效率&#xff1b;那如果想要进一步提升执行效率&#xff0c;该怎么办呢&#xff1f;有一个方法是使用线程池。 首先&#xff0c;什么是线程池&#xff1a;池就是池子&am…...

数据库 mysql 的彻底卸载

MySQL卸载步骤如下&#xff1a; &#xff08;1&#xff09;按 winr 快捷键&#xff0c;在弹出的窗口输入 services.msc&#xff0c;打开服务列表。 &#xff08;2&#xff09;在服务列表中&#xff0c; 找到 mysql 开头的所有服务&#xff0c; 右键停止&#xff0c;终止对应的…...

Meterpreter工具使用

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

第四讲 单片机STC89C52+RA8889代码移植范例(包含API接口)

本次介绍单片机STC89C52RA8889代码移植范例&#xff0c;该范例已将RA8889的API移植好了&#xff0c;下方提供下载地址。 硬件平台&#xff1a;89C52RA8889 采用SPI通信方式 (已测试通过&#xff09; 上一讲已经阐述RA8889移植到51单片机的基本方法&#xff0c;本讲增加了API…...

QT 音乐播放器【一】 显示音频级别指示器

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

【MATLAB源码-第220期】基于matlab的Massive-MIMO误码率随着接收天线变化仿真采用ZF均衡和QPSK调制。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. 系统背景与目标 无线通信系统的发展极大地推动了现代通信技术的进步&#xff0c;从移动通信到无线局域网&#xff0c;甚至是物联网&#xff0c;均依赖于无线通信系统的高效和可靠性。在无线通信系统中&#xff0c;核心目…...

【前端】政务服务大数据可视化监控平台(源码+html+css+js)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…...

【网关】工业智能网关-02

一 公司简介 保定飞凌嵌入式技术有限公司始于2006年&#xff0c;是一家专注嵌入式核心控制系统研发、设计和生产的高新技术企业&#xff0c;是国内最早专业从事嵌入式技术的企业之一。 经过十几年的发展与积累&#xff0c;公司拥有业内一流的软硬件研发团队&#xff0c;在北京…...

【C语言】动态内存管理技术文档

【C语言】动态内存管理技术文档 目录 【C语言】动态内存管理技术文档 一、内存管理基础...

低空经济的意义所在

发展低空经济对于推动经济发展、促进产业升级、降低运输成本、构建综合交通系统等方面都具有重要意义。低空经济对推动经济发展提供新动能。低空经济作为新兴产业&#xff0c;具有巨大的发展潜力&#xff0c;能够带动投资、促进消费&#xff0c;为经济增长注入新动力。除此之外…...

DNF手游攻略:0氪攻略,转职技巧与避坑指南!

在DNF手游的冒险旅程中&#xff0c;角色的转职是一次重要的成长经历。通过转职&#xff0c;玩家可以获得全新的技能和属性&#xff0c;提升自己在地下城中的战斗力。本文将为您介绍转职后的关键技巧和日常任务&#xff0c;帮助您更好地适应新的职业身份&#xff0c;成为地下城中…...

周报 | 24.5.27-24.6.2文章汇总

为了更好地整理文章和发表接下来的文章&#xff0c;以后每周都汇总一份周报。 周报 | 24.5.20-24.5.26文章汇总-CSDN博客 集智书童 | YOLOv10开源&#xff5c;清华用端到端YOLOv10在速度精度上都生吃YOLOv8和YOLOv9_yolov8 yolov10-CSDN博客 机器之心 | 清华接手&#xff0c…...

【C++初阶学习】第十二弹——stack和queue的介绍和使用

C语言栈&#xff1a;数据结构——栈(C语言版)-CSDN博客 C语言队列&#xff1a;数据结构——队列&#xff08;C语言版&#xff09;-CSDN博客 前言&#xff1a; 在之前学习C语言的时候&#xff0c;我们已经学习过栈与队列&#xff0c;并学习过如何使用C语言来实现栈与队列&…...

nginx反向代理了解

文章目录 Nginx反向代理反向代理系统调优Proxy Buffer相关指令 Nginx 具有高性能的http和反向代理的web服务器&#xff0c;同时也是一个pop3/smtp/imap代理服务器&#xff0c;使用c语言编写 **Web服务器&#xff1a;**也叫网页服务器&#xff0c;web server&#xff0c;主要功…...

插入排序和希尔排序

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

Java web应用性能分析之【java进程问题分析定位】

Java web应用性能分析之【java进程问题分析概叙】-CSDN博客 Java web应用性能分析之【java进程问题分析工具】-CSDN博客 Java web应用性能分析之【jvisualvm远程连接云服务器】-CSDN博客 由于篇幅限制、前面三篇讲了准备工作和分析小结&#xff0c;这里将详细操作java进程问题…...

c#控件笔记

c# PictureBox在工具箱的哪个位置 在 Visual Studio 的工具箱中&#xff0c;PictureBox 控件位于 “Common Controls” 部分。要找到 PictureBox&#xff0c;请按照以下步骤操作&#xff1a; 打开 Visual Studio 并加载您的项目。确保已经打开了设计器视图&#xff08;即您的…...

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) 解释&#xff1a; 用户调用如accept、read等系统调用&#xff0c;向内核发起I/O请求后&#xff0c;应用程序…...

大米cms安装支付逻辑漏洞

1.安装 下载来源&#xff1a;https://www.cnblogs.com/xfbk/p/17910054.html 链接&#xff1a;https://pan.baidu.com/s/1b-Z6RaFBZ6CsSIErY46Pyg?pwdq8qq 提取码&#xff1a;q8qq 注意一下配置就可以了&#xff1a;php5.5apachemysql5.0&#xff0c;主要就是数据库版本要注…...

使用 zxing 生成二维码以及条形码

需求背景 前期在做项目的时候&#xff0c;有一个需求是说要生成一张条形码&#xff0c;并且呢将条形码插入到 excel 中去&#xff0c;但是之前一直没有搞过找个条形码或者是二维码&#xff0c;最后是做出来了&#xff0c;这里呢就先看看怎么生成&#xff0c;后面再抽时间来写写…...

发布 jar 包到 maven 中央仓库

目前开发基本都是以maven或者gradle的方式,直接引入依赖包即可,那么该咋那么发布我们自己的jar包到maven仓库,让别人使用呢?本文适用于2024.3之后的步骤 文章目录 账号准备第一步,注册账号第二步,新建命名空间第三步,验证命名空间第四步,创建 push 的账号和密码点击右…...

AI智能体研发之路-模型篇(四):一文入门pytorch开发

博客导读&#xff1a; 《AI—工程篇》 AI智能体研发之路-工程篇&#xff08;一&#xff09;&#xff1a;Docker助力AI智能体开发提效 AI智能体研发之路-工程篇&#xff08;二&#xff09;&#xff1a;Dify智能体开发平台一键部署 AI智能体研发之路-工程篇&#xff08;三&am…...

英语口语中though的用法(even though、as though)

文章目录 英语口语中 "though" 的用法详解1. "Though" 作为转折连词的用法1.1 基本用法示例句子&#xff1a; 1.2 位置灵活性示例句子&#xff1a; 2. "Though" 作为副词的用法2.1 表示对比或转折示例句子&#xff1a; 2.2 强调前述观点示例句子…...

菜刀冰蝎哥斯拉流量通讯特征绕过检测反制感知

1.加密流程 工具名称requestsresponseAntSwordbase64等方式明文冰蝎2.0开启Openssl扩展-动态密钥aes加密aes加密base64未开启Openssl扩展-异或异或base64冰蝎3.0开启Openssl扩展-静态密钥aes加密aes加密base64未开启Openssl扩展-异或异或base64哥斯拉php的为base64异或base64异…...

前端 JS 经典:判断数组的准确方法

前言&#xff1a;判断数组的方法有很多&#xff0c;但是最完美的只有一个。 1. Object.prototype.toString.call 通过 toString.call 方法来判断是否数组。 function isArray(obj) {return Object.prototype.toString.call(obj) "[object Array]"; } 缺点&#…...

【仓库设置问题】

问题&#xff1a; 某公司在高速公路一些服务站内开设了百货超市&#xff0c;为了能及时给这些百货超市提供足够的商品&#xff0c;他们需要在一些百货超市旁修建仓库。一个仓库可以同时为多家百货超市提供服务&#xff0c;以满足各个超市对商品的需求。现已知这些百货超市在高…...

深度学习知识与心得

目录 深度学习简介 传统机器学习 深度学习发展 感知机 前馈神经网络 前馈神经网络&#xff08;BP网络&#xff09; 深度学习框架讲解 深度学习框架 TensorFlow 一个简单的线性函数拟合过程 卷积神经网络CNN&#xff08;计算机视觉&#xff09; 自然语言处理NLP Wo…...

Qt for Android

文章 USB Qt for android 获取USB设备列表&#xff08;一&#xff09;Java方式 获取 Qt for android 获取USB设备列表&#xff08;二&#xff09;JNI方式 获取 Qt for android 串口库使用 Qt for android : libusb在android中使用 Qt for Android : 使用libusb做CH340x串口传…...

HTTP 的三次握手

​​​​​ HTTP 的三次握手是指在建立 TCP 连接时&#xff0c;客户端和服务器之间进行的三步握手过程。这个过程确保了双方都能够互相通信&#xff0c;并且同步了彼此的序列号和确认号。 概念&#xff1a; 第一次握手&#xff1a;客户端发送一个 SYN&#xff08;同步…...