千万别从系统中创建线程, 看看从线程池中调用的线程的效率(1)

本篇会加入个人的所谓鱼式疯言

❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言

而是理解过并总结出来通俗易懂的大白话,

小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.

🤭🤭🤭可能说的不是那么严谨.但小编初心是能让更多人能接受我们这个概念 !!!

在这里插入图片描述

在当今这个多核处理器成为标配的时代,如何高效地利用计算资源已成为软件开发中不可忽视的关键因素。随着应用程序变得越来越复杂,对并发处理的需求也日益增长。试想一下,在一个繁忙的服务器上,如果每一个新任务都创建一个新的线程来处理,那么系统将不堪重负——频繁的线程创建和销毁不仅消耗大量的时间和内存,还可能导致系统性能急剧下降。

前言

为了解决这一问题,并实现 更高效的资源管理线程池 的概念应运而生。线程池是一种用于 管理和复用一组预先创建好的线程 的方法,它通过预先创建一定数量的工作线程并将其 置于池中等待分配任务 ,从而 避免了频繁创建和销毁线程 带来的开销。

接下来的内容中,小编将带着小伙伴深入探讨 线程池的基本原理参数类型

目录

  1. 线程池的初识

  2. Java标准库中线程池的参数列表(重点)

一. 线程池的初识

1. 线程池的引入

我们知道,线程对于进程来说, 线程是 更微量的进程 ,开销更小, 但对于线程的本身来说虽然开销比较大。

但随着当前 并发编程的日益需求 越来越大, 频繁的从系统中 创建线程销毁线程的开销 还是相对而已比较大的。

所以我们就引入 “线程池” 的概念, 具体线程池是什么,该怎么理解,下面让小编具体来说明下吧

2. 线程池的概念以及理解

<1>. 线程池的概念

的概念好比一个地方,这个地方操作系统提前创建 好多线程 放在这个地方。

任务繁忙 的时候,我们就 从这个地方中调用这些线程

任务不繁忙 的时候,我们就把这些 线程重新调度回这个地方

而这个地方我们就成为 “线程池”

<2>. 线程池的理解

我们知道, 线程是操作系统进行 调度执行的基本单位

每次创建线程是从操作系统中 创建并且调度执行的

操作系统可以简单 分为 内核区 和 用户区。

内核区 是操作系统硬件的内层管理

用户区 是各种软件资源的任务执行

而操作系统面对多个软件的运行事务是十分繁忙的, 每创建一个 线程 去调度执行任务也不可控的。

好比现在小编要去银行去办理取钱事务, 就想柜台提出诉求, 但柜台说需要户口本复印件。

这时银行这边刚好有打印机

我有两种方式可以得到户口本的复印件

  1. 请柜台小姐姐帮我打印一下

  2. 自己动手打印

如果我们操作系统创建线程的, 就相当于请柜台小姐姐帮我 打印户口本 ,但柜台小姐姐的事务是 比较繁忙的 , 这个执行是 不可控的 , 我们并不知道柜台小姐姐什么时候完成事务来帮我打印户口本。

所以就像我们的操作系统创建线程一样,由于我们的操作系统是繁忙的,就有可能对于创建线程的这种需求,造成 一定的开销

而我们在线程池中去调度执行线程, 就好比上面的第二种方案,这是我们自己的去动手完成我们自己的需求,具体需要多久去完成,这些操作是由我们自己决定的, 这种行为是可控的。 所以 开销势必会少很多 , 也会 更轻量

二. Java标准库中线程池的参数列表(重点)

在我们 Java标准库 中提供一个很多类来创建我们的 线程池 来进行 任务的执行

其中我们重点讲解面试中常考的这个类,ThreadPoolExecutor (很多参数) ,

因为这个 参数比较多 , 也很麻烦,下面让小编仔细到来。

1. ThreadPoolExecutor

ThreadPoolExecutor 这个类来自于 java.util.concurrent 这个包。

在这里插入图片描述

在这个方法中, 我们有提供七个参数, 是 面试场合中HR比较喜欢问的话题

下面就让小编来 细细道来 吧。

2. corePoolSize 和 maximumPoolSize

corePoolSize: 线程核心数, 就是说在这个线程中都必须有的元老级别的线程, 在创建这个线程池是就至少有这些线程。

在我们的线程池中,有两类线程: 核心线程和非核心线程

当我们 任务繁忙 时, 核心线程和非核心线程都会 被创建出来一起工作

当我们 任务不繁忙 时, 只需要核心线程来工作, 而非核心线程就会被销毁

所以一定会 执行的是核心线程,任务繁忙被销毁的 , 就是我们的非核心线程

maximumPoolSize : 最大线程数

而我们的 最大线程数= 核心线程数 + 非核心线程数。

而真正限制 最大线程数 的主要因素就是我们的 CPU的核心数

鱼式疯言

核心线程: 好比我们一个公司的正式员工,无论公司是否繁忙, 公司都是需要的, 不会随意开除正式员工。

非核心线程: 好比我们一个公司的实习生, 只有当公司繁忙时,实习生才会 被录用 , 而 当公司不繁忙时 , 实习生就会 被开除

3. keepAliveTime 和 unit

一个线程是 有可能没有任务去工作 ,这时操作系统就需要考虑要不要 回收释放这个线程资源, 就需要考虑这个线程需要 空闲的最大时间

keepAliveTime : 允许空闲的最大时间, 一旦 实际的空闲时间 超过这个 允许空闲的最大时间 ,这个线程就会 被释放

unit: 允许空闲的最大时间的单位设置, 这里的单位设置就有很多种: 毫秒,妙, 日,月,年等…

鱼式疯言

允许空闲的最大时间 : 就好比一个实习生需要去不断的去工作,如果这个实习生没有任务可做,空闲下来了 ,一旦超过这个允许空闲的最大时间,公司就会把这个实习生给开除掉。

4. workQueue

在我们线程中,不同的线程可能执行不同的任务, 而这些任务该怎么存放和管理呢?

于是我们就借助了一个特殊的队列: 阻塞队列

workQueue:工作队列:对于这个队列本质上是一个Running类型的阻塞队列用于我们工作队列: BlockingQueue<running> workQueue = new BlockingQueue<running>; , 这个队列我们就需要把需要完成的任务都存放在这个 工作队列 中, 进行工作。

鱼时疯言

此处的队列:

  1. 队列的大小: 程序员自己定义Size

  2. 队列的类型: 程序员自己决定

5. threadFactory

对于我们线程池的初始化, 我们可能会想到构造方法, 但是 构造方法也可能会出现问题 , 于是我们就引入一种设计模式(套路) : 工厂设计模式 来进行补充 我们构造方法对于线程池初始化的不足

构造方法的问题:

因为构造方法会对于 类型不同,数量不同 的方法会发生 重载

而对于 类型相同,数量相同的构造方法 来说,就不会发生 重载 ,就无法实现我们 多个参数的初始化

线程工厂: 在我们线程工厂中设计了一种普通的 成员方法(静态方法) 来通过执行我们的方法对线程池中的 成员变量 进行 初始化操作 , 从而解决构造方法重载的不足问题

鱼式疯言

有图有真相

在这里插入图片描述

6. handler (重点掌握)

对于线程过多, 执行的任务超出了我们的 最大限度线程池 会通过 阻塞等待的操作防止任务过满 吗?

答案是 不会的 .

hander: 拒绝策略:对于任务过满,任务加载过多的情况, 我们的会根据不同的情况采用 4 种不同的策略 来安排我们下一步该怎么操作。

4种不同的策略:

在这里插入图片描述

<1>. AbortPolicy

这种处理方式就比较简单粗暴,当 任务过满 时, 添加任务时就会 直接抛出异常, 相当于这个无论是当前讲要执行的任务,还是之前的任务都无法执行,程序直接中断

<2>. CallerRunspolicy

这种处理方式就比较友好,当任务过满时, 线程池会 拒绝执行新增加的任务 ,而是按照常规任务 继续执行

<3>. DifcardOldestPolicy

当任务过满时,这个方式就是把最老的那个任务给踢掉,让 新的任务添加进来执行。 这样保证任务 不会出现过满 的情况,也能执行到 新的任务

<4>. DiscardPolicy

当任务过满时, 这个方法就是在 任务队列 中, 把 最新的那个任务给踢掉

注意: 在任务队列中踢掉的任务,是 其他线程也不能执行到的

鱼式疯言

给小伙伴举个生活中的栗子吧 😁 😁 😁 😁

有一天小爱同学和我同时写博客, 她突然跑过来说,让我过去帮她写一下,有些东西不是很懂, 但我现在也要写博客啊,那就会采取下面4 种策略。

  1. 抛出异常: 我直接告诉小爱同学,今天好累啊,我都有点不想写博客了, 于是小爱同学的博客没有帮忙写,小编自己的博客同时也没写,新的任务和之前的任务都不执行 , 直接摆烂了

  2. 拒绝执行: 我告诉小爱同学,你先自己搞搞呗,我这边自己还得写博客呢 ,这样新的任务我 拒绝执行 了, 我还是 继续执行我自己的任务她去执行她自己的任务。

  3. 踢掉老任务: 小爱同学找我帮忙,于是我就把任务中最老的任务给踢掉,直接去执行她的那个新任务了

  4. 踢掉新任务: 小爱同学找我帮忙,我就和小爱同学说,你先别写,先看我平常是怎么写的,于是我就把这个新任务都踢掉,大家不去执行这个新的任务

总结

  • 线程池的初识: 线程池对于线程开销的认识以及背后更好去调度的原理理解。
  • . Java标准库中线程池的参数列表(重点): 认识到对于 ThreadPoolExecutor 这个类的认识是来源于 java.util.concurrent这个包, 并且熟悉了七个参数的用法,理解了工厂设计模式,和拒绝策略的4种不同方式。

如果觉得小编写的还不错的咱可支持 三连 下 (定有回访哦) , 不妥当的咱请评论区 指正

希望我的文章能给各位宝子们带来哪怕一点点的收获就是 小编创作 的最大 动力 💖 💖 💖

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web3.js 4.x版本事件监听详解:从HTTP到WebSocket的迁移

项目场景 在一个使用以太坊区块链技术的项目中&#xff0c;需要监听智能合约的事件&#xff0c;以便在事件触发时能够及时响应。项目中使用了web3.js库的4.x版本&#xff0c;节点使用Geth启动&#xff0c;并通过HTTP与节点进行通信。 问题描述 合约DataStorage.sol文件已经定…

学习c语言第16天(数据的存储)

一、数据类型的介绍 c语言基本的内置类型 类型的意义&#xff1a; 1.使用这个类型开辟内存空间的大小(大小决定了使用范围) 2.如何看待内存空间的视角 1.类型的基本归类 整形家族 字符的本质是ASCII码值&#xff0c;是整形 int a等于 signed int a char稍微特殊一些…

新书速览|动手学PyTorch建模与应用:从深度学习到大模型

《动手学PyTorch建模与应用&#xff1a;从深度学习到大模型》 本书内容 《动手学PyTorch建模与应用:从深度学习到大模型》是一本从零基础上手深度学习和大模型的PyTorch实战指南。《动手学PyTorch建模与应用:从深度学习到大模型》共11章&#xff0c;第1章主要介绍深度学习的概念…

Python --Pandas库基础方法(2)

文章目录 Pandas 变量类型的转换查看各列数据类型改变数据类型 重置索引删除行索引和切片seriesDataFrame取列按行列索引选择loc与iloc获取 isin()选择query()的使用排序用索引排序使用变量值排序 修改替换变量值对应数值的替换 数据分组基于拆分进行筛选 分组汇总引用自定义函…

优思学院|抽样检验的概念和21种抽样方式

抽样检验的概念 根据事先制定的抽样方案&#xff0c;从一批产品中随机抽取一部分作为样品&#xff0c;以这部分样品的检验结果&#xff0c;对整批产品质量合格与否作出判定的活动过程&#xff0c;称为抽样检验。除了用于质量控制之外&#xff0c;抽样检验同样适用于在六西格玛…

AI工作流程设计的自动化优化:微软与斯坦福的新成果 - Trace

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

学习网络安全 为什么Linux首择Kali Linux? 以及如何正确的使用Kali Linux

1.什么是kali linux&#xff1f; Kali Linux是一款基于Debian的Linux发行版&#xff0c;主要用于网络安全测试和渗透测试。它由全球顶尖的安全专家和黑客社区维护开发&#xff0c;提供了丰富的工具和资源&#xff0c;用于测试安全性、漏洞利用和渗透测试。此外&#xff0c;Kal…

修复msvcp120.dll丢失的问题的几种简单方法,msvcp120.dll是什么

在使用电脑时&#xff0c;你可能会遭遇一个提示称“msvcp120.dll丢失”的错误信息。这个问题比较普遍&#xff0c;主要是因为你的系统中缺失了某个特定的动态链接库&#xff08;DLL&#xff09;文件。msvcp120.dll是由 Microsoft Visual C 可再发行包提供的关键文件&#xff0c…

一键切换阿里yum源(包括其他系统repo镜像查找方法)

一键切换阿里yum源 示例命令其他系统repo镜像GitHub文档 示例命令 # 备份旧源 mv CentOS-Base.repo CentOS-Base.repo.bak # 添加新源(阿里镜像源) wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo其他系统repo镜像 这里的示例是用…

链表篇-02.从尾到头打印链表(反转链表)

解题思路&#xff1a; 链表从尾到头打印链表, 我的思路是 用三个指针,第一个指针(pre)指向指向头节点的前一个位置&#xff0c;第二个指针(cur)指向头节点&#xff0c; 然后依次往后执行&#xff0c;第三个指针用于临时记录第二个指针的下一个位置。 代码详情: import java.…

2024年中职云计算实验室建设及云计算实训平台整体解决方案

随着信息技术的飞速发展&#xff0c;云计算作为新一代信息技术的核心&#xff0c;正逐步渗透到各行各业&#xff0c;成为推动数字化转型的重要力量。为了适应这一趋势&#xff0c;中职教育作为技能型人才培养的重要阵地&#xff0c;亟需加强云计算实验室建设与云计算实训平台的…

【Linux】CentOS更换国内阿里云yum源(超详细)

目录 1. 前言2. 打开终端3. 确保虚拟机已经联网4. 备份现有yum配置文件5. 下载阿里云yum源6. 清理缓存7. 重新生成缓存8. 测试安装gcc 1. 前言 有些同学在安装完CentOS操作系统后&#xff0c;在系统内安装比如&#xff1a;gcc等软件的时候出现这种情况&#xff1a;&#xff08…

【C++进阶学习】第九弹——哈希的原理与实现——开放寻址法的讲解

前言&#xff1a; 在前面&#xff0c;我们已经学习了很多存储机构&#xff0c;包括线性存储、树性存储等&#xff0c;并学习了多种拓展结构&#xff0c;效率也越来越高&#xff0c;但是是否有一种存储结构可以在大部分问题中都一次找到目标值呢&#xff1f;哈希可能能实现 目录…

Maven已经导入Junit包,但是还是无法使用注解

Maven已经导入Junit包&#xff0c;但是还是无法使用注解 背景&#xff1a; 导入了Junit的依赖 <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></d…

【初阶数据结构题目】2.移除元素

文章目录 顺序表算法题代码&#xff1a; 顺序表算法题 点击链接做题 移除元素 思路&#xff1a;定义两个变量指向数组第一个位置&#xff0c;判断nums[src]是否等于val 相等&#xff0c;src不相等&#xff0c;nums[dst] nums[src],src,dst 代码&#xff1a; int removeElem…

如何使用CANoe自带的TCP/IP Stack验证TCP的零窗口探测机制

如果想利用CANoe自带的TCP/IP协议栈验证TCP的零窗口探测机制,就必须添加一个网络节点并配置独立的CANoe TCP/IP协议栈,作为验证对象。而与它进行TCP通信的对端也是一个网络节点,但不要配置TCP/IP协议栈,而是使用CAPL代码在底层组装TCP报文模拟TCP通信过程。这样可以尽量减少…

轻松入门Linux—CentOS,直接拿捏 —/— <1>

一、什么是Linux Linux是一个开源的操作系统&#xff0c;目前是市面上占有率极高的服务器操作系统&#xff0c;目前其分支有很多。是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统 Linux能运行主要的UNIX工具软件、应用程序和网络协议 Linux支持 32…

基于Drone实现CI/CD【0到1架构系列】

CI/CD是持续性集成和持续性部署&#xff0c;简单来讲就是自动化构建和自动化部署。目前有很多集成方案&#xff0c;也有很多组装方案&#xff0c;只要能实现自动化构建出制品&#xff0c;再自动部署到生产环境就行。 目前很多源代码都集成了CI/CD功能&#xff0c;drone也是目前…

还在用JVM跑你的Java代码吗?太慢了,试试Oracle的GraalVM吧

前言 对于Java开发者们来说&#xff0c;几乎每天都在和JVM打交道&#xff0c;然而JVM即将过时了。那些对新技术保持敏锐洞察力的开发者&#xff0c;可能已经在生产环境中部署GraalVM生成的二进制程序了&#xff0c;小伙伴们&#xff0c;你们已经用起来了吗&#xff1f; Graal…

【初阶数据结构题目】3.删除有序数组中的重复项

文章目录 顺序表算法题代码&#xff1a; 顺序表算法题 点击链接做题 删除有序数组中的重复项 思路&#xff1a;定义两个指针变量。dst指向数组第一个位置&#xff0c;src指向数组第二个位置。判断nums[dst]是否等于nums[src] 相等&#xff0c;src不相等&#xff0c;dst,nums[…