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

#详细介绍!!!线程池

本篇详细:

1.介绍了什么是线程池

2.使用线程池有什么好处

3.线程池的工作流程

4.线程池的各个参数介绍

5.如何编写Java代码来创建线程池

6.使用线程池的注意事项

目录

一:什么是线程池

二:为什么使用线程池来管理线程

三:线程池的工作流程

四:线程池的各个参数介绍

五:使用Java代码创建线程池

5.1 依靠Executors工厂类来创建

  5.2 依靠ThreadPoolExecutor类来创建

六:使用线程池的注意事项

1.合理的设置线程的数量



一:什么是线程池

线程池总的来说:就是创建的一个进行线程管理的容器集合,主要为了提高管理线程效率,是一种多线程处理的形式。

线程池:就是开发者根据需求创建多个线程放到一个池中(逻辑意义上),来统一管理这些线程,由池中的任务队列来直接给池中的空闲线程分配任务,大致为这样的一个过程

二:为什么使用线程池来管理线程

使用线程池的主要目的就是提高线程的调度执行和管理上的效率

优势:

1.降低资源的开销

没有线程池时线程的创建和销毁一般是由操作系统来进行的,而操作系统对线程的控制一般又是不可控的,那么当线程超过空闲时间,而线程就可能会被自动销毁,此时这中反复的操作就有可能出现线程频繁创建和销毁的情况,虽然说线程的创建和销毁的效率对比进程已经优化了很多,但是依旧会造成大量的系统资源上的浪费。

那么如果利用线程池来集中创建线程进行管理,并且核心线程创建完成后,没任务也不会进行销毁。此时就大大减少了系统频繁对线程的创建和销毁造成的资源浪费了。

2.提高任务的响应速度

任务需要线程来执行,而线程由系统进行调度又是无序的,那么就有可能在任务过多时,导致系统响应该任务过慢,此时这种把任务直接让系统来分配线程执行,我们称为用户态+内核态。

当我们(用户)把一个任务交给系统来分配线程(内核)来进行执行时,此时系统不一定会直接响应去执行我们的任务,因为系统需要同时处理大量的响应,导致任务获得响应的速度较低。

如果使用我们自己创建的线程池来进行任务的响应,那么此时就是一个纯用户态的操作了。

因为线程池中有自己的线程,去执行线程池对应的任务队列中的任务,当线程空闲就直接去队列中获取其他任务,直接响应;且由于有核心线程的存在,此时线程池中的核心线程一直都在,并不会被销毁,此时也省去了创建线程进行的时间开销,进一步使得响应速度变快。

3.可管理性

利用线程池集中统一管理,监控池中的线程,避免由于线程数量过多且线程之间相互进行抢占系统资源导致线程大面积堵塞

三:线程池的工作流程

大致如下图:

1.线程池在创建时,就会指定好各个参数的数量(例如:核心线程,临时线程等)

2.线程池有一个与之对应的任务队列(由于线程池作用的环境一般是多线程并发的状态,此时任务队列也是线程安全的数据结构)

3.我们在使用线程池时只需要往线程池的任务队列中添加任务,此时

        3.1如果池中的线程小于核心线程数就会创建核心线程再执行任务,且执行完不进行销毁

        3.2如果池中的线程大于核心线程数,小于临时线程数,此时就会把任务分配给空闲的线程如果线程全部都被占用此时就会创建临时线程来执行任务

        3.3如果池中线程数已满(核心线程数+临时线程数),此时就会运行线程池的拒绝策略

注意:线程池的拒绝策略后面单独进行讲解(重点面试题)

四:线程池的各个参数介绍

查看官方文档:

查看官方文挡,线程池的构造方法,我们可以看到如下的参数

参数介绍:

1. int corePoolSize :核心线程数

线程池中的核心线程创建之后就不会被销毁,需要用的时候,直接安排任务

2. int maximumPoolSize:最大线程数

最大线程数就是线程池允许同时存在的线程的最大数量:核心线程数+临时线程数

临时线程在执行完任务之后,空闲一定的时间会自动销毁,需要用的时候再创建

3.long keepAliveTime临时线程的空闲存活时间

与第2个对应,临时线程空闲一定时间后会自动销毁,而keepAliveTime就是设置的空闲时间

4.TimeUnit unit:时间单位

时间参数的单位:例如TimeUnit SECOND(秒),设置时间单位为秒

5.BlockingQueue<Runnable> workQueue:堵塞队列(用于记录存储需要执行的任务)

workQueue就是我们前面一直说的任务队列,线程池中都有一个用于记录任务的队列

BlockingQueue 为一个线程安全的阻塞队列,参数为Runnable:为一个实际任务,通过重写重写run方法来描述具体的任务逻辑

6.ThreadFactory threadFactory:工厂类:用于辅助线程创建的类(参考工厂模式)

7.RejectedExecutionHandler handler:线程池的拒绝策略

指定线程池的拒绝策略,如果线程池满了,依旧在添加任务,那么就可根据设置的拒绝策略来进行拒绝(专门讲线程池拒绝策略的时候再详细介绍)

五:使用Java代码创建线程池

5.1 依靠Executors工厂类来创建

1. newFixedThreadPool(int n),返回类型为ExecutorService接口类型

指定线程池中线程的数量为n,并且这些线程都为核心线程

ExecutorService pool = Executors.newFixedThreadPool(10);

2.newSingleThreadPool(),返回类型为ExecutorService接口类型

单例线程池,固定线程池中的线程数量为1,且为核心线程

ExecutorService pool = Executors.newSingleThreadExecutor();

3.newCatchThreadPool(),返回类型为ExecutorService接口类型

创建的线程池中核心线程数为0,最大线程数为Integer.MAX_VALUE

keepAliveTime:60 ; TimeUnit为SECOND(秒):临时线程空闲等待时间为60秒,时间到了自动销毁

总结:以这种方式创建的线程池,池中的线程都是临时线程

ExecutorService pool = Executors.newCachedThreadPool();

4.newScheduledThreadPool(int n),返回类型为ScheduledExecutorSerives接口类型

定时任务线程池:其中可设置池中线程定时或者周期性的执行池中的任务

n为核心线程数

介绍几种该线程池的安排任务的方法区别

4.1 调用schedule方法个线程池安排任务(普通定时任务)

4.2 调用scheduleAtFixedRate方法给线程池安排周期性任务(从任务开始时计算周期定时时间)

4.3调用scheduleWithFixedDelay方法给线程池安排周期性任务(从任务结束开始计算周期定时时间)

//1.普通定时任务
pool.scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {System.out.println("hello1");}
},2,TimeUnit.SECONDS);//2.周期任务
pool.scheduleAtFixedRate(new Runnable() {@Overridepublic void run() {System.out.println("hello1");}
},2,5,TimeUnit.SECONDS);//3.周期任务
pool.scheduleWithFixedDelay(new Runnable() {@Overridepublic void run() {System.out.println("hello2");}
},2,5,TimeUnit.SECONDS);

上诉三个代码的作用:

1. 安排了一个打印hello1的任务,定时2秒后执行任务

2.安排了一个周期性打印hello2的任务,定时2秒后执行,并且从任务开始执行时开始计算,5秒后再次执行该任务,以这种周期执行

3.安排了一个周期性打印hello3的任务,定时2秒后执行,并且从任务结束是开始计算周期间隔时间,间隔时间为5秒

5.newSingleThreadScheduleExecutor();返回类型为ScheduledExecutorSerives接口类型

单个线程的定时任务或者周期任务的线程池。池中只有一个线程,其他与4基本一致

ScheduledExecutorService pool = Executors.newSingleThreadScheduledExecutor();

  5.2 依靠ThreadPoolExecutor类来创建

通过ThreadPoolExecutor类来更加灵活的创建线程池,根据ThreadPoolExecutor类的构造方法传递一系列参数进行灵活创建。

代码:

BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>();ThreadPoolExecutor pool = new ThreadPoolExecutor(5,10,60,TimeUnit.SECONDS,queue);

指定一个线程安全的阻塞队列来存储线程池中的任务,

new ThreadPoolExecutor(5,10,60,TimeUnit.SECONDS,queue):

表示corePoolSize(核心线程数)为5;maximumPoolSize(最大线程数)为10

keepAliveTime(临时线程最大空闲时间)为60;TimeUnit.SECOND:单位为秒

queue为任务队列

当然还可以根据需求增加其他参数,参数详情参照前面线程池参数介绍

六:使用线程池的注意事项

1.合理的设置线程的数量

线程池的工作线程数设置应根据实际情况配置,CPU密集型业务(搜索、排序等)CPU空闲时间较少,线程数就不需要设置太多。N核服务器,通过执行业务的单线程分析出本地计算时间为x,等待时间为y,则工作线程数(线程池线程数)设置为 N*(x+y)/x,能让CPU的利用率最大化

相关文章:

#详细介绍!!!线程池

本篇详细&#xff1a; 1.介绍了什么是线程池 2.使用线程池有什么好处 3.线程池的工作流程 4.线程池的各个参数介绍 5.如何编写Java代码来创建线程池 6.使用线程池的注意事项 目录 一&#xff1a;什么是线程池 二&#xff1a;为什么使用线程池来管理线程 三&#xff1a;线程池…...

【嵌入式Linux学习笔记】基于Linux官方库的标准外设驱动

对于标准的外设如LED&#xff0c;KEY&#xff0c;PWM等&#xff0c;以及标准通信协议&#xff0c;Linux都自带有标准的驱动库&#xff0c;不需要我们自行编写&#xff0c;只需要配置好相应的GPIO属性和电气属性&#xff0c;即可匹配相应的驱动&#xff0c;在应用程序中直接使用…...

网络爬虫抓包工具

&#x1f4da;介绍&#xff1a;Charles是著名的抓包工具&#x1f402;&#xff0c;可以抓取移动端与pc端网络访问&#x1f577;的所有数据。我们将使用它抓取我们与小程序交互的所有信息。&#x1f387;我们可以百度搜索Charles官网下载适用于自己系统的Charles安装包&#x1f…...

蓝桥杯倒计时 | 倒计时17天

作者&#x1f575;️‍♂️&#xff1a;让机器理解语言か 专栏&#x1f387;&#xff1a;蓝桥杯倒计时冲刺 描述&#x1f3a8;&#xff1a;蓝桥杯冲刺阶段&#xff0c;一定要沉住气&#xff0c;一步一个脚印&#xff0c;胜利就在前方&#xff01; 寄语&#x1f493;&#xff1a…...

【Spring Cloud Alibaba】7.Sentinel熔断器仪表盘监控

文章目录简介什么是 Sentinel控制台获取源码方式下载jar包方式启动访问服务配置项目&#xff0c;启用Sentinel完整配置测试简介 接下来我们通过Sentinel控制台来实现对服务消费者提供的熔断机制进行监控和控制&#xff0c;本操作先要完成之前的步骤&#xff0c;详情请参照【Sp…...

个人博客系统项目测试报告

项目背景介绍 背景&#xff1a;当在学习一项技能的时候&#xff0c;我们总会习惯通过博客来记录所学的知识点&#xff0c;方便后期遗忘时随时查看和快速复习。本次开发的Web网站程序便是为了更加轻量和方便地记录自己的学习笔记 概述&#xff1a;一个Web网站程序&#xff0c;…...

flutter安装自用笔记

参照文章&#xff1a; 开发环境搭建 Flutter环境配置步骤&#xff1a; 1.系统配置要求 2.Java环境 3.Flutter SDK 4.Android 开发环境一、系统配置要求 操作系统&#xff1a;Windows 7 SP1 或更高的版本&#xff08;基于 x86-64 的 64 位操作系统&#xff09; 磁盘空间&…...

tomcat线程池以及在SpringBoot中的启动过程

tomcat两大组件&#xff1a;连接器Connector&#xff0c;容器Container tomcat线程池 Tomcat线程池扩展了ThreadPoolExecutor&#xff0c;行为稍有不同 重写了ThreadPoolExecutor的execute方法 如果总线程数达到maximumPoolSize&#xff0c;不会立刻抛RejectedExecutionExcept…...

第十四届中国大学生创新创业大赛

文章目录比赛官网比赛题目含金量非常高建议参加的学生推荐几个我感兴趣的题目联系比赛官网 官网地址&#xff1a;http://www.fwwb.org.cn/ 实际叫做&#xff1a;中国大学生创新创业大赛 比赛题目 题目公布查看地址&#xff1a;http://www.fwwb.org.cn/topic/index 题目有…...

LeetCode:322. 零钱兑换——动态规划从案例入门

&#x1f34e;道阻且长&#xff0c;行则将至。&#x1f353; &#x1f33b;算法&#xff0c;不如说它是一种思考方式&#x1f340;算法专栏&#xff1a; &#x1f449;&#x1f3fb;123 一、&#x1f331;322. 零钱兑换 题目描述&#xff1a;给你一个整数数组coins&#xff0c;…...

【lwIP(第四章)】网络接口

目录一、lwIP网络接口简介二、lwIP的netif结构三、lwIP的netif相关函数1. lwIP网络接口的全局变量2. netif_add()函数3. netif_remove()函数4. netif_set_default()函数一、lwIP网络接口简介 lwIP协议栈支持多种不同的网络接口&#xff08;网卡&#xff09;&#xff0c;由于网卡…...

Vue3 pinia入门篇(一)

系列文章目录 主要为了记录如何使用Pinia在Vue3中的使用方式&#xff08;下面会介绍为什么使用Vue3选型&#xff09; 文章目录系列文章目录不用Vue2使用Pinia举例子&#xff1f;1.笔者的个人看法&#xff1a;2.总结一、Pinia是什么1.状态管理工具&#xff08;类比Vuex&#xff…...

python面向对象编程解释

python是一个面向对象的编程语言 面向过程的开发语言有C&#xff0c;面向对象除了python还有java等语言 具体来讲&#xff1a; 面向过程 &#xff1a;举个例子&#xff0c;比如说&#xff0c;把大象装进冰箱总共分几步&#xff0c;第一步&#xff0c;把冰箱门打开&#xff0c…...

ARM(IMX6U)嵌入式软件裸机开发之环境搭建与配置

目录 前沿 Ubuntu 和 Windows 文件互传 Ubuntu 下 NFS 和 SSH 服务开启 Ubuntu 交叉编译工具链安装 Source Insight 软件安装和使用 Visual Studio Code 软件的安装和使用 前沿 为什么我们要学习裸机开发呢&#xff1f; 1、裸机开发是了解所使用的 CPU 最直接、最简单的方…...

Java文件复制多种方法

1、InputStream与OutputStream 创建两个文件 - 源和目标。然后我们从源创建InputStream并使用OutputStream将其写入目标文件进行 java 复制文件操作。 private static void copyFileUsingStream(File source, File dest) throws IOException {InputStream is null;OutputStr…...

Java语言-----封装、继承、抽象、多态、接口

目录 前言 一.封装 1.1封装的定义 1.2访问修饰符的使用 二.继承 2.1继承的定义 2.2继承的方法 2.3继承使用注意点 三.多态 3,1多态的定义 3.2动态绑定 3.3方法重写 3.4向上&#xff08;向下&#xff09;转型 四.抽象 4.1抽象的概述和定义 4.2抽象的使用 五…...

基于深度学习的瓶子检测软件(UI界面+YOLOv5+训练数据集)

摘要&#xff1a;基于深度学习的瓶子检测软件用于自动化瓶子检测与识别&#xff0c;对于各种场景下的塑料瓶、玻璃瓶等进行检测并计数&#xff0c;辅助计算机瓶子生产回收等工序。本文详细介绍深度学习的瓶子检测软件&#xff0c;在介绍算法原理的同时&#xff0c;给出Python的…...

仿网易云小程序(一)

目录 一、项目准备 二、项目初始化 1.新建项目 2.封装service请求 三、底部导航栏的设计 四、MV页面的设计 1.将获取到的数据进行渲染 2.播放量数据进行处理转换 3.时长数据进行处理转换 五、MV组件的抽离封装 六、请求的抽离video 七、下拉重新请求新的数据 八、跳转到…...

【C++】vector模拟实现及其应用

文章目录vector的介绍vector的使用及其实现vector的定义vector iterator 的使用vector空间增长问题vector的增删查改vector的介绍 vector是表示可变大小数组的序列容器。就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素…...

JS看这一篇就够啦,JS基础大全,可用于快速回顾知识,面试首选

1 JS简介 更多JS内容可以看MDN&#xff1a;点击传送 浏览器分成两部分&#xff1a;渲染引擎和 JS 引擎 渲染引擎&#xff1a;用来解析HTML与CSS&#xff0c;俗称内核&#xff0c;比如 chrome 浏览器的 blink &#xff0c;老版本的 webkitJS 引擎&#xff1a;也称为 JS 解释器…...

武汉凯迪正大GB4208外壳防护等级试具

一、IP1X 试验探棒 产品概述&#xff1a; 符合IEC61032图1试具A、GB16842试具A、GB4208IP1、IEC60529IP1、IEC60065 等标准要求。用于防止手背触及的防护检验。 技术参数&#xff1a; 1、探球直径&#xff1a;50mm 2、挡板直径&#xff1a;45mm 3、挡板厚度&#xff1a;…...

Cent OS 从零部署ruoyi-cloud教程

1、java环境安装 https://blog.csdn.net/m0_61035257/article/details/125705400 Java_home设置 https://blog.csdn.net/m0_51104427/article/details/123924893 2、mysql安装 https://blog.csdn.net/ShockChen7/article/details/126965940 若安装的是Mysql8&#xff0c;建议…...

ChatGPT相关核心算法

ChatGPT 的卓越表现得益于其背后多项核心算法的支持和配合。本文将分别介绍作为其实现基础的 Transformer 模型、激发出其所蕴含知识的Prompt/Instruction Tuning 算法、其涌现出的思维链能力、以及确保其与人类意图对齐的基于人类反馈的强化学习算法。 1.基于Transformer的预…...

Python导入模块,Python import用法(超级详细)

使用 Python 进行编程时&#xff0c;有些功能没必须自己实现&#xff0c;可以借助 Python 现有的标准库或者其他人提供的第三方库。比如说&#xff0c;在前面章节中&#xff0c;我们使用了一些数学函数&#xff0c;例如余弦函数 cos()、绝对值函数 fabs() 等&#xff0c;它们位…...

大量产品“GPT 化”,开源大模型 AI 应用开发框架发布

大型语言模型&#xff08;LLM&#xff09;的出现&#xff0c;让我们看到了 AI 在自然语言处理方面的潜力&#xff0c;它涌现出来的创造力和思维能力令人叹为观止&#xff0c;并在新一代人机交互领域释放了大量的想象空间。 目前&#xff0c;决策者、产品负责人和开发者都在抢滩…...

STM32——IIC总线(MPU6050应用)

目录 一、IIC介绍 二、MPU6050 三、MPU6050实例 四、EEPROM ---------------------------------------------------------------------------------------------------------------------------- 每次都是IIC好没新意啊&#xff0c;我决定这次录视频的时候举两个例子&…...

ADB使用经验

adb是Android Debug Bridge的缩写&#xff0c;是一种用于与Android设备通信的命令行工具。它可以通过USB连接或Wi-Fi连接&#xff0c;允许开发者在计算机和Android设备之间进行文件传输、安装应用程序、调试应用程序等操作。要使用adb&#xff0c;需要先将Android设备与计算机连…...

详解LinkedHashSet和LinkedHashMap

目录 一.LinkedHashSet和LinkedHashMap 1.基本介绍 2.与HashSet和HashMap的区别 3.LinkedHashSet和LinkedHashMap具体的方法 1.LinkedHashSet 2.LinkedHashMap 二.模拟代码实现LinkedHashMap 三.具体应用 一.LinkedHashSet和LinkedHashMap 1.基本介绍 顾名思义,根据名…...

C++ LinuxWebServer 2万7千字的面经长文(下)

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的在读研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; Linux Web Server项目虽然是现在C求职者的人手一个的项目&#xff0c;但是想要吃透这个项目&#xff0c;还是…...

RK3568平台开发系列讲解(驱动基础篇)IO 模型的分类

🚀返回专栏总目录 文章目录 一、阻塞 IO二、非阻塞 IO三、IO 多路复用四、信号驱动五、异步 IO沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将针对IO模型进行分类。 假设有这样一个场景,从磁盘中循环读取 100M 的数据并处理,磁盘读取 100M 需要花费 20 秒的…...

北京网站设计公司兴田德润怎么样/百度推广点击一次多少钱

1.安装插件&#xff1a; 这里可以搜索到插件并安装。 2.修改快捷键或查找快捷键&#xff1a; 这里可以进行快捷键的查找和修改 3.进入引用文件&#xff1a; 点击f12&#xff0c;或者右击快捷键可以看到进入引用文件的快捷方法。 4.查看目录&#xff1a; 转载于:https://www.cnb…...

杭州网站公司设计/怎么开网站平台挣钱

从毕业到现在&#xff0c;已有2年了&#xff0c;自己学的软件专业而从事的是网络管理。现在在网络管理方面是很强了&#xff0c;但是自己爱好的专业方面一点也没有进步&#xff0c;为了以后的发展我决定从事软件测试和网络管理两方面同时下手&#xff0c;可能在学习这两方面的时…...

网站建设推广怎么做/网络平台推广方式

桥接模式 桥接模式用一种很巧妙的方式处理继承存在的问题&#xff0c;用抽象关联取代了传统的多层继承&#xff0c;将类之间的静态继承关系转换为动态的对象组合关系&#xff0c;使得系统更加灵活&#xff0c;并易于扩展&#xff0c;同时有效地控制了系统中类的个数。 模式动机…...

石景山区城乡建设委员会网站/怎样申请自己的电商平台

假设按照升序排序的数组在预先未知的某个点上进行了旋转。 ( 例如&#xff0c;数组 [0,0,1,2,2,5,6] 可能变为 [2,5,6,0,0,1,2] )。 编写一个函数来判断给定的目标值是否存在于数组中。若存在返回 true&#xff0c;否则返回 false。 示例 1: 输入: nums [2&#xff0c;5&…...

python可以做网站/大地seo视频

一个合格的前端工程师应该具备怎样的能力&#xff1f;下面和千锋广州小编一起来看看吧。 1、学习新技术的能力 无论你是一个入坑多年的老鸟还是刚刚入坑的菜鸟&#xff0c;心里都明白&#xff0c;前端技术的更新真的不是一般的快啊。如果想要做好前端开发这项工作&#xff0c…...

专业网站建设公司郑州/营销活动方案模板

【中央处理器】 1CPU的组成&#xff1a;CPU主要由运算器、控制器、寄存器组和片内总线等 2控制器&#xff1a;由程序计数器(PC)、指令寄存器(IR)、指令译码器(ID)、时序产生器、操作控制器等组成 控制器的主要功能&#xff1a;(1)、从内存中取出一条指令&#xff0c;并指出下…...