【JavaEE初阶】深入理解线程池的概念以及Java标准库提供的方法参数分析

前言

🌟🌟本期讲解关于MySQL索引事务,希望能帮到屏幕前的你。

🌈上期博客在这里:【JavaEE初阶】多线程案列之定时器的使用和内部原码模拟-CSDN博客

🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客

目录

📚️1.引言 

 📚️2.线程池的基本认知

2.1线程池的概念

2.2 线程池的引入

1.引入协程

2.引入线程池

 2.3标准库中的线程池

1.corePoolSize与maximumPoolSize

2.keepAliveTime和TimeUnit

 3.BlockingQueue

4.ThreadFactory

5. RejectedExecutionHandler

 📚️3.线程池的基本使用

3.1Executor的使用

3.2线程池中线程数量

 3.3线程池的实现

1.构造阻塞队列

2.构造方法

3.submit方法

4.主函数

5.输出

 📚️4.总结

📚️1.引言 

      Hello!!!家人们,国庆是否过得快乐呢??本期小编将讲解关于多线程中比较重要的一个概念,即线程池的概念,以及工厂模式在线程池中的使用,准备好了吗~~~🥳🥳🥳;

且听小编进行讲解,包你学会!!! 

 📚️2.线程池的基本认知

2.1线程池的概念

        线程池是一组预先创建好的线程集合,这些线程处于等待分配任务的状态。当有任务需要执行时,无需创建新线程,而是从线程池中获取一个空闲线程来执行任务。任务完成后,线程不会被销毁,而是返回线程池继续等待下一个任务。

通俗总结:

1.线程池就是一个存储线程的地方,用使用时就从这里取空闲的线程

2.使用过后,线程放回线程池,不被销毁,等待下一个任务

2.2 线程池的引入

最开始,引入了进程,解决了并发编程的问题,但是由于频繁的创建销毁进程,造成了成本消耗提高,此时就引入了线程

此时又因为线程的频繁创建和开销,所造成的成本消耗是不可以忽视的(抛开剂量谈毒性,都是耍流氓),那么就有以下两种办法

1.引入协程

这里的协程也叫做纤程,即轻量化线程;

本质:协程的本质就是通过用户态代码进行控制的,不是通过内核中的调度器进行调度的;

在用户态代码中协程是通过线程进行封装的可能是N个协程对应一个线程,还有可能是N个协程对应M个线程,一个代码中可以创建很多的协程,但是不能创建很多的线程~~~ 

2.引入线程池

 由于其线程池的概念,可以知道,线程池降低了线程频繁创建销毁的成本消耗,所以就引入了线程池;

为啥线程池取线程比系统中申请线程更高效呢???

假如我们在银行中要进行打印某个证件,我们可以自己去打印或者喊工作人员进行帮助,如下图;

那么此时如果银行人员进行帮助,就会消失在我们的视野,我们不知道 他去干嘛了,此时就是不可控制的,那么对应的效率就比较低;但是当我们自己去打印,就是我们可以控制的,效率高

注意:

从线程池里取线程,是纯用户态的代码(可以控制,效率更高)

通过系统申请线程,是内核态(不可控制,效率更低)

 2.3标准库中的线程池

在Java标准库中提供了,关于线程池的构造方法即ThreadPoolExecutor,那么这个方法在Java文档中有很多的参数,小编将一一解释;

1.corePoolSize与maximumPoolSize

 corePoolSize:即核心线程数,一个线程池里,最少得有多少个任务;

maximumPoolSize:即最大线程数,一个线程池里,最多有多少个线程;

在标准库提供的线程数目不是一成不变的,这是根据当前的任务的多少来决定的,任务少线程少,任务多线程多,这是一个自适应的过程;

2.keepAliveTime和TimeUnit

这两个是联合进行是使用的,即线程在线程池中空闲状态下能存活多久前面表示数字,后面表示的是时间单位(h,ms,s...) 

即线程超过空闲时间后,机会进行销毁,再次使用时再创建一个新的线程;

 3.BlockingQueue<Runnable>

这里用runnable作为描述任务的主体,和定时器哪里的是类似的;

4.ThreadFactory

即工厂模式,是一种常见的设计模式,通过专门的工厂类来进行对象的创建,这里就是通过工厂类创建线程对象 

这个类提供了方法封装了newThread,给Thread设置了一些属性

5. RejectedExecutionHandler

即拒绝策略,当任务太多,此时线程池有阻塞队列,容纳的任务已经上限了,此时就要进行一些操作,再Java文档中有以下几个策略;

1.第一种

解释:即抛出异常,旧的任务和新的任务都不执行了;

2.第二种

解释:新的任务由引进任务的线程进行执行,线程池不执行这个任务,继续做自己的任务

 3.第三种

解释:即线程池舍去一个最老的任务,添加新的任务进行执行

4.第四种

 

解释:不管这个任务,线程池继续做自己的任务

 📚️3.线程池的基本使用

有上述的线程池的介绍中,我们知道ThreadPoolExecutor是非常复杂,参数是比较多多,所以在Java标准库中还有介绍了一种简单的版本

即Executor工厂类,通过这个类创建线程对象,内部已经对 ThreadPoolExecutor 进行了参数的设置,

3.1Executor的使用

创建对象,代码如下:

ExecutorService service= Executors.newFixedThreadPool(4);

 在此时Executors点出来的方法不止一个,如下图:

 具体代码的使用:

1.实现Fix表示方法的使用,即规定线程池的线程数量

代码如下:

 ExecutorService service= Executors.newFixedThreadPool(3);service.submit(new Runnable() {@Overridepublic void run() {System.out.println("工厂类创建的线程池对象");}});

这里就是表示的是规定的线程数量为3个,submit进行任务的添加;

2.规定时间进行任务的执行

代码如下:

 ScheduledExecutorService service1=Executors.newScheduledThreadPool(1);service1.schedule(()->{System.out.println("111");},3,TimeUnit.SECONDS);service1.shutdown();

这里的1表示的是核心线程数目,这里通过schedule来添加定时执行的任务,3表示数字SECONDS表示的是秒,即三秒后再执行;

3.2线程池中线程数量

这里设计线程池规定的线程数量的时候,是要根据具体的代码来进行分析的;

CPU密集型任务:即线程大部分的时间都在CPU上进行计算;

IO密集型任务:即任务大部分时间都在等待IO不用去CPU上进行计算;

那么此时:如果是所有任务都是CPU密集型任务,那么此时线程数目就不能超过CPU逻辑核心数;反之如全都是IO密集型任务,此时线程数目就可以远远大于逻辑核心数目;(极端的情况下)

解决:尝试给线程池设定不同的线程数目,观察线程时间开销和系统资源占用开销的占比,来找到合适的值; (线程数目增加,时间开销下降,系统资源占用增加,反之则反)

 3.3线程池的实现

这里就是四部走的过程:

1.提供构造方法,指定线程数目

2.在构造方法中创建并启动线程

3.阻塞队列的持有的要执行任务

4.submit方法提供执行任务

1.构造阻塞队列

 代码如下:

BlockingQueue<Runnable> queue=new ArrayBlockingQueue(100);

这里的runnable就是任务执行的主体

2.构造方法

代码如下:

 public MyThreadPoolExecutor(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();}}

解释:这里的n代表包含的线程数目,在外部循环是在线程创建的时候执行,while循环是为了保证线程不断对阻塞队列进行扫描,执行任务,如果为空那么此时就发生阻塞;

3.submit方法

代码如下:

public void submit(Runnable runnable) throws InterruptedException {queue.put(runnable);}

解释:通过这个方法进行任务的输入,与主函数对应

4.主函数

代码如下:

 public static void main(String[] args) throws InterruptedException {MyThreadPoolExecutor myThreadPoolExecutor=new MyThreadPoolExecutor(4);for (int i = 1; i <100 ; i++) {int n=i;myThreadPoolExecutor.submit(new Runnable() {@Overridepublic void run() {System.out.println("这是线程"+Thread.currentThread().getName()+"执行第"+n+"个任务");}});}}

解释:实例化对象后,通过for循环持续进行任务的输入,这里的n是为了防止变量捕获,实现日志的打印;这种方法的执行,小编在上期的定时器的写法类似哦;

5.输出

图片演示如下:

可以看到这里的执行过程不是严格的升序执行的,所以这里即存在任务的抢占;(这里小编只是截取了一部分输出案列) 

 📚️4.总结

💬💬本期小编主要讲解了关于线程池的基本概念认知,为啥引入线程池,并且线程池中拒绝策略是什么,以及我们如何实现线程池的模拟,也提供了代码供各位uu进行参考~~~;

在线程池的模拟中小编的代码上传Gitee了:GGBondlctrl/Thread (gitee.com)

🌅🌅🌅~~~~最后希望与诸君共勉,共同进步!!!


💪💪💪以上就是本期内容了, 感兴趣的话,就关注小编吧。

                             😊😊  期待你的关注~~~

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

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

相关文章

Python酷库之旅-第三方库Pandas(134)

目录 一、用法精讲 601、pandas.DataFrame.plot.pie方法 601-1、语法 601-2、参数 601-3、功能 601-4、返回值 601-5、说明 601-6、用法 601-6-1、数据准备 601-6-2、代码示例 601-6-3、结果输出 602、pandas.DataFrame.plot.scatter方法 602-1、语法 602-2、参数…

【C++】入门基础介绍(下)输入输出,函数重载,缺省与引用

文章目录 7. C输入与输出8. 缺省参数9. 函数重载10. 引用10. 1 引用的概念10. 2 引用的特性10. 3 引用的使用10. 4 const引用10. 5 指针和引用的关系 11. inline12. nullptr 7. C输入与输出 iostream是 Input Output Stream 的缩写&#xff0c;是标准输入、输出流库&#xff0…

BFS解决最短路问题_最小基因变化、单词接龙_C++

BFS解决最短路问题_最小基因变化、单词接龙_C 1. 题目解析2. 算法分析3. 代码实现4. 举一反三&#xff1a;单词接龙 1. 题目解析 leetcode链接&#xff1a;https://leetcode.cn/problems/minimum-genetic-mutation/submissions/569463000/ 基因序列可以表示为一条由 8 个字符组…

【计算机网络】面试必问TCP十大机制

1. TCP协议的报文格式 说明&#xff1a; TCP 报文格式主要分为两部分&#xff1a;TCP 报文头部和数据部分。以下是对各字段的详细解释&#xff1a; TCP 报文头部 源/目的端口&#xff1a;各占用16位。表示数据从哪个进程发送&#xff0c;发送到哪个进程去。序号字段&#xff1a…

千古风流人物 陆游

简介 陆游&#xff08;1125年-1210年&#xff09;&#xff0c;字务观&#xff0c;号放翁&#xff0c;越州山阴&#xff08;今浙江绍兴&#xff09;人&#xff0c;南宋诗人、词人。后人每以陆游为南宋诗人之冠。是中国南宋时期的著名文学家、词人、政治家和军事家。 陆游出生在…

基于SpringBoot+Vue+MySQL的药品信息管理系统

系统展示 管理员界面 医生界面 员工界面 系统背景 随着医疗技术的不断提升&#xff0c;药品在治疗疾病中扮演着越来越重要的角色。传统的药品管理方式以人工方式为主&#xff0c;但人工管理难以满足现代社会快速发展的需求。因此&#xff0c;需要一种更加高效、便捷的信息化管理…

FLORR.IO画廊(2)

指南针&#xff08;超级&#xff09; 是Florr.io的一种辅助花瓣&#xff0c;用于指示超级生物的位置。 基础&#xff08;超级&#xff09; 是florr.io的一种攻击型花瓣&#xff0c;玩家在初次游玩时即获得5个基本&#xff0c;个数不随着等级改变而改变&#xff0c;基本不可合成…

C++之模版进阶篇

目录 前言 1.非类型模版参数 2.模版的特化 2.1概念 2.2函数模版特化 2.3 类模板特化 2.3.1 全特化和偏特化 2.3.2类模版特化应用实例 3.模版分离编译 3.1 什么是分离编译 3.2 模板的分离编译 3.3 解决方法 4. 模板总结 结束语 前言 在模版初阶我们学习了函数模版和类…

erlang学习:Linux命令学习9

sed命令介绍 sed全称是&#xff1a;Stream EDitor&#xff08;流编辑器&#xff09; Linux sed 命令是利用脚本来处理文本文件&#xff0c;sed 可依照脚本的指令来处理、编辑文本文件。Sed 主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等 sed 的运行…

四川全寄宿自闭症学校专业团队详解

在广州市的一隅&#xff0c;有一所名为星贝育园的特殊教育学校&#xff0c;它远离城市的喧嚣与纷扰&#xff0c;为自闭症儿童提供了一个宁静、安全的学习与生活环境。这所学校致力于通过全方位的教育和照顾&#xff0c;帮助自闭症儿童在这个充满挑战的世界中寻找到属于自己的快…

【C++】—— 继承(上)

【C】—— 继承&#xff08;上&#xff09; 1 继承的概念与定义1.1 继承的概念1.2 继承定义1.2.1 定义格式1.2.2 继承父类成员访问方式的变化 1.3 继承类模板 2 父类和子类对象赋值兼容转换3 继承中的作用域3.1 隐藏规则3.2 例题 4 子类的默认成员函数4.1 构造函数4.1.1 父类有…

Oracle 11g RAC 节点异常重启问题分析

一、背景 在国庆期间巡检的时候&#xff0c;发现数据库alert日志中出现了异常重启的信息&#xff0c;当即对该报错进行分析处理。 二、处理过程 &#xff08;1&#xff09;数据库告警日志分析 node1 alert&#xff1a; Sat Oct 05 13:05:14 2024 Thread 1 advanced to log …

【光追模组】使命召唤7黑色行动光追mod,调色并修改光影,并且支持光追效果,游戏画质大提升

大家好&#xff0c;今天小编我给大家继续引入一款游戏mod&#xff0c;这次这个模组主要是针对使命召唤7黑色行动进行修改&#xff0c;如果你觉得游戏本身光影有缺陷&#xff0c;觉得游戏色彩有点失真的话&#xff0c;或者说你想让使命召唤7这款游戏增加对光线追踪的支持的话&am…

75 华三vlan端口隔离

华三vlan端口隔离 为了实现端口间的二层隔离&#xff0c;可以将不同的端口加入不同的VLAN&#xff0c;但VLAN资源有限。采用端口隔离特性&#xff0c;用户只需要将端口加入到隔离组中&#xff0c;就可以实现隔离组内端口之间二层隔离&#xff0c;而不关心这些端口所属VLAN&…

剖析 Redis:应对雪崩、穿透和击穿的实战秘籍

前言 用户的数据通常存储在数据库中&#xff0c;而数据库的数据存放在磁盘上。 磁盘的读写速度在计算机硬件中可以说是最慢的。 如果用户的所有请求都直接访问数据库&#xff0c;当请求数量增多时&#xff0c;数据库很容易崩溃。因此&#xff0c;为了避免用户直接访问数据库&a…

Java垃圾回收简述

什么是Java的垃圾回收&#xff1f; 自动管理内存的机制&#xff0c;负责自动释放不再被程序引用的对象所占用的内存。 怎么触发垃圾回收&#xff1f; 内存不足时&#xff1a;JVM检测到堆内存不足时&#xff0c;无法为新的对象分配内存时&#xff0c;会自动触发垃圾回收。手动…

Pandas -----------------------基础知识(八)

Pandas内置Matplotlib 加载数据 import pandas as pdanscombe pd.read_csv(/root/pandas_code_ling/data/e_anscombe.csv) anscombe dataset_1 anscombe[anscombe[dataset]I] dataset_1dataset_1.describe() 提供数据 dataset_1 anscombe[anscombe[dataset]I] dataset_2 an…

【C语言】分支和循环(2)

&#x1f914;个人主页: 起名字真南 &#x1f619;个人专栏:【数据结构初阶】 【C语言】 【C】 目录 1 关系操作符2 条件操作符3 逻辑操作符 &#xff1a;|| &#xff0c;&& &#xff0c;&#xff01;3.1 逻辑取反运算符3.2 与运算符3.3 或运算符3.4 练习闰年判断3.5 短…

仪器校准机构不符合项应该怎么签发和整改?

签发不合格项是内审工作之中非常重要的一环&#xff0c;那么如何正确签发不合格项&#xff0c;下列几个方面可以供大家参考&#xff1a; 一、目的 为便于仪器校准机构正确理解不符合项整改要求&#xff0c;特制定本指南&#xff0c;以指导企业规范、有效、高效地处理不符合项。…

旅游管理智能化:SpringBoot框架的应用

第一章 绪论 1.1 研究现状 时代的发展&#xff0c;我们迎来了数字化信息时代&#xff0c;它正在渐渐的改变着人们的工作、学习以及娱乐方式。计算机网络&#xff0c;Internet扮演着越来越重要的角色&#xff0c;人们已经离不开网络了&#xff0c;大量的图片、文字、视频冲击着我…