线程池总结

一,线程池的参数介绍:

在这里插入图片描述
通过上图可知:ThreadPoolExecutor有7个参数

corePoolSize:核心线程数
  • 举个简单的例子:一个奶茶店老板,在生意正火爆的时候发现正式员工人手不够了,于是他就想了个办法,在旺季多招一些临时工,等到生意淡下来了就将那些临时工辞掉,这里的正式员工就相当于是核心线程数(一旦录用,永不辞退)。
  • (注意:如果在实际开发中有人问到:核心线程数设置成多少更合适,此时只要是你回答出了具体的数字,那都是错的,这个问题应该看场景,具体设置成多少要改变不同的值去调试)。
maximumPoolSize:最大线程数
  • 正如上面的例子,那些实习生就相当于最大线程数(一段时间不干活就被辞退)。
keepAliveTime:临时工允许的空闲时间
  • 如果临时工的空闲时间超出了这个时间就会被辞退,同理:也就是一些临时创建的线程超时了,就会被销毁。
unit:keepaliveTime 的时间单位, 是秒, 分钟, 还是其他值
workQueue:传递任务的阻塞队列
  • 本质也就是存放数据的一种数据结构
  • 在这里插入图片描述
    我们传入的任务通过submit 调用 put 方法,使这个任务入队列。在线程执行的时候,通过take方法来从队列中取出任务。
threadFactory:创建线程的⼯⼚, 参与具体的创建线程⼯作. 通过不同线程⼯⼚创建出的线程相当于对⼀些属性进⾏了不同的初始化设置
  • 可能你会有点懵,很正常,上图:
  • 工厂类的定义:
    在这里插入图片描述
  • 工厂类的实现:
    在这里插入图片描述
RejectedExecutionHandler: 拒绝策略, 如果任务量超出公司的负荷了接下来怎么处理(这也是这七个参数中最重要的一个)
  • AbortPolicy(): 超过负荷, 直接抛出异常.
  • CallerRunsPolicy(): 调⽤者负责处理多出来的任务.
  • DiscardOldestPolicy(): 丢弃队列中最⽼的任务.
  • DiscardPolicy(): 丢弃新来的任务.
    通俗点来说
    在这里插入图片描述

二,使用Executors 创建常见的线程池

Executors 创建线程池的⼏种⽅式

  • newFixedThreadPool: 创建固定线程数的线程池
  • newCachedThreadPool: 创建线程数⽬动态增⻓的线程池.
  • newSingleThreadExecutor: 创建只包含单个线程的线程池.
  • newScheduledThreadPool: 设定 延迟时间后执⾏命令,或者定期执⾏命令. 是进阶版的 Timer.
    (Executors 本质上是 ThreadPoolExecutor 类的封装)

三, 线程池的工作流程

此时我们就要模拟实现一个线程池了,步骤:

  • 1)核⼼操作为 submit, 将任务加⼊线程池中
  • 2)使⽤ Worker 类描述⼀个⼯作线程. 使⽤ Runnable 描述⼀个任务.
  • 3)使⽤⼀个 BlockingQueue 组织所有的任务
  • 4)每个 worker 线程要做的事情: 不停的从 BlockingQueue 中取任务并执⾏.
  • 5)指定⼀下线程池中的最⼤线程数 maxWorkerCount; 当当前线程数超过这个最⼤值时, 就不再新增
    线程了
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
class MyThreadPool{//创建阻塞队列private BlockingQueue<Runnable> pool = new ArrayBlockingQueue<>(5);//写submit方法:并将对象传入阻塞队列public void submit(Runnable runnable) throws InterruptedException {pool.put(runnable);}//构造方法:当每次传入一个 n 之后,就会循环 n 次去创建 n 个线程对象,public MyThreadPool(int n){for (int i = 0; i < n; i++) {//注意:外面的for循环和里面的线程的内容是没有任何关系的,因为线程里面的内容是在另一个线程中//执行的,而for循环是在main线程中执行的。所以,要是你有一个疑问:while循环的条件不是true吗//为啥还能继续执行下一个for循环,而不是卡到这里了。原因就是他们是在不同的线程上执行的,for循环//和Thread里面的内容是没有关系的。Thread t1  = new Thread(() ->{while(true){Runnable  r = null;try {r = pool.take();} catch (InterruptedException e) {throw new RuntimeException(e);}r.run();}});t1.start();}}
}
public class Demo1 {public static void main(String[] args) throws InterruptedException {//我们首先创建了4个核心线程MyThreadPool pool = new MyThreadPool(4);for (int i = 0; i < 1000; i++) {pool.submit(new Runnable() {@Overridepublic void run() {System.out.println(Thread.currentThread().getName()+"  hellO");}});}}
}
执行顺序图解:

在这里插入图片描述

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

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

相关文章

用包装类型定义属性

以布尔字段为例&#xff0c;当我们没有设置对象的字段的值的时候&#xff0c;Boolean类型的变量会设置默认值为null&#xff0c;而boolean类型的变量会设置默认值为false。 也就是说&#xff0c;包装类型的默认值都是null&#xff0c;而基本数据类型的默认值是一个固定值&…

vue2和vue3 全选

vue3 <template><input type"checkbox" v-model"selectAll" />全选<ul><li v-for"item in list" :key"item.id">{{ item.value }} <input type"checkbox" v-model"item.check" />…

想走?可以!先买票--迭代器模式

1.1 乘车买票&#xff0c;不管你是谁&#xff01; 售票员检查谁没有买票&#xff0c;把车厢里的人都遍历一遍。 1.2 迭代器模式 迭代器模式&#xff08;Iterator&#xff09;&#xff0c;提供一种方法顺序访问一个聚合对象中的各个元素&#xff0c;而又不暴露该对象的内部表示…

7-23 币值转换

题目链接&#xff1a;7-23 币值转换 一. 题目 1. 题目 2. 输入输出样例 3. 限制 二、代码 1. 代码实现 #include <iostream> #include <string> using namespace std;string numStr[] { // 0-9对应的字符串&#xff08;字符串是方便string&#xff09;"a…

LLM - 大语言模型(LLM) 的 应用技术

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/137503579 大语言模型(LLM) 的应用技术范围非常广泛,即: LangChain:开发框架,专为大型语言模型设计,以提高开发人工智能应用的效率,允许开发者将语言模…

Day16_学点儿JavaEE_实践_基于IDEA2023的简易JavaWeb项目、Tomcat输出乱码解决

0 JavaWeb项目目录 └──JavaWeb├──resources│ └──db.properties├──src│ └──com.sdust.web│ ├──servlet│ │ └──StudentServlet│ ├──pojo│ │ └──Student│ └──util│ └──JDBCUtil├──web│ ├──st…

蓝桥杯 总结经典基础题型

十进制转R进制 #include<iostream> #include<string> #include<algorithm> using namespace std;string tentoR(int x, int r) {if (x 0) return "0"; // 如果x为0&#xff0c;直接返回"0"string s;while (x) {int num x % r;if (num…

Nginx健康检查

Nginx健康检查nginx_upstream_check_module nginx健康检查介绍: ​ 主动健康检查&#xff0c;nignx定时主动地去ping后端的服务列表&#xff0c;当发现某服务出现异常时&#xff0c;把该服务从健康列表中移除&#xff0c;当发现某服务恢复时&#xff0c;又能够将该服务加回健…

Day106:代码审计-PHP原生开发篇文件安全上传监控功能定位关键搜索1day挖掘

目录 emlog-文件上传&文件删除 emlog-模板文件上传 emlog-插件文件上传 emlog-任意文件删除 通达OA-文件上传&文件包含 知识点&#xff1a; PHP审计-原生开发-文件上传&文件删除-Emlog PHP审计-原生开发-文件上传&文件包含-通达OA emlog-文件上传&文件…

【高项】信息化发展

目录 1.1 信息与信息化 1.1.1 信息 1.信息的定义 2.信息的特征与质量 1.1.2 信息系统 1.信息系统及其特性 2.信息系统生命周期 1.1.3 信息化 1.信息化内涵 2.信息化体系&#xff08;口诀&#xff1a;上应下技左人右规&#xff0c;中资网&#xff09; 1.2 现代化基础…

集装箱5G智能制造工厂数字孪生可视化平台,推进企业数字化转型

集装箱5G智能制造工厂数字孪生可视化平台&#xff0c;推进企业数字化转型。在当下数字化转型的热潮中&#xff0c;集装箱5G智能制造工厂数字孪生可视化平台成为了推动企业转型升级的重要工具。这一平台将先进的5G技术与智能制造相结合&#xff0c;通过数字孪生技术实现生产过程…

SpringMVC之静态资源访问

文章目录 SpringMVC之静态资源访问1. 后缀形式没有『静态资源访问』问题2. / 和 /* 会遇到『静态资源访问』问题3. 解决方案一4. 解决方案二 SpringMVC之静态资源访问 1. 后缀形式没有『静态资源访问』问题 如果你将 DispatcherServlet 的 url-pattern 配置成后缀形式&#x…

【JavaScript】浏览器与事件循环

浏览器的进程模型 主要包含&#xff1a;浏览器进程、网络进程、渲染进程&#xff1b; 一个进程就是一块内存空间&#xff1b; 进程&#xff1a;操作系统资源分配的基本单位&#xff0c;每一个进程都拥有独立的内存空间和系统资源&#xff0c;可以独立运行&#xff1b; 线程…

开课通知 | 5月六西格玛绿带培训火热招生

尊敬的各位学员&#xff1a; 天行健管理咨询将于近期开展六西格玛绿带公开课&#xff0c;旨在为广大企业和个人提供专业的六西格玛绿带培训&#xff0c;帮助大家掌握六西格玛绿带的核心知识和技能&#xff0c;提升工作效率和质量。现将相关事宜通知如下&#xff1a; 一、培训时…

工智能图像降噪软件 ON1 NoNoise AI 2024 for Mac激活版

ON1 NoNoise AI 2024 for Mac是一款专为Mac用户设计的先进人工智能图像降噪软件。其核心功能在于能够利用机器学习技术&#xff0c;快速并智能地消除图像中的噪点&#xff0c;无论是亮度噪点还是颜色噪点&#xff0c;都能得到显著的改善。 软件下载&#xff1a;ON1 NoNoise AI …

【AR】使用深度API实现虚实遮挡

遮挡效果 本段描述摘自 https://developers.google.cn/ar/develop/depth 遮挡是深度API的应用之一。 遮挡&#xff08;即准确渲染虚拟物体在现实物体后面&#xff09;对于沉浸式 AR 体验至关重要。 参考下图&#xff0c;假设场景中有一个Andy&#xff0c;用户可能需要放置在包含…

揭秘英特尔AI芯片如何做到比H100训练快40%、推理快50%

英特尔&#xff0c;开始正面硬刚英伟达了。 深夜时分&#xff0c;英特尔CEO帕特基辛格激动展示全新AI芯片Gaudi 3&#xff0c;引领未来科技潮流&#xff0c;开启智能新篇章。 他为什么开心到现场直接蹦迪&#xff1f; 看下Gaudi 3的性能结果&#xff0c;就一目了然了&#xf…

【回溯】Leetcode 78. 子集【中等】

子集 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[],[1],[2],[1,2…

算法打卡day32

今日任务&#xff1a; 1&#xff09;738.单调递增的数字 2&#xff09;968.监控二叉树 738.单调递增的数字 题目链接&#xff1a;738. 单调递增的数字 - 力扣&#xff08;LeetCode&#xff09; 文章讲解&#xff1a;代码随想录 (programmercarl.com) 视频讲解&#xff1a;贪…

(Java)数据结构——正则表达式

前言 本博客是博主用于复习数据结构以及算法的博客&#xff0c;如果疏忽出现错误&#xff0c;还望各位指正。 正则表达式概念 正则表达式&#xff0c;又称规则表达式&#xff08;Regular Expression&#xff09;&#xff0c;是一种文本模式&#xff0c;包括普通字符&#xf…