多线程7——线程池各参数的意义+四种拒绝策略+代码模拟实现

文章目录

  • 前言
  • 一、线程池是什么?
  • 二、线程池的使用
    • 1.代码使用线程池
    • 2.剖析线程池
    • 3.线程池的拒绝策略
  • 三、代码模拟实现线程池
  • 总结


前言

本人是一个刚刚上路的IT新兵,菜鸟!分享一点自己的见解,如果有错误的地方欢迎各位大佬莅临指导,如果这篇文章可以帮助到你,劳请大家点赞转发支持一下!

本文介绍了线程池的作用,以及线程池的重要参数以及四种拒绝策略,用代码模拟实现了线程池,本节内容理论较多,大家要细细品读。


一、线程池是什么?

线程池是一种利用池化技术思想来实现的线程管理技术,主要是为了 复用线程、便利地管理线程和任务 并将 线程的创建 任务的执行 解耦开来。我们可以创建线程池来 复用已经创建的线程来降低频繁创建和销毁线程所带来的资源消耗

线程池就是一个🧑🏻‍💻线程管理员,当你有新的任务需要线程去执行时,可以直接去和线程池借一个线程来用( 🔧不再频繁创建线程 ),那么这样创建线程就不是向系统申请,而是从线程池里拿,用完之后再把线程还给线程池( 💉不再随意销毁空闲线程 )。

虽然线程的创建虽然比进程更加轻量,但是频繁创建的情况下,创建线程的这笔开销也是不容忽略的!(程序员不就是让代码跑的又快又准的存在吗!😭😭😭)


二、线程池的使用

1.代码使用线程池

    public static void main(String[] args) {// 创建一个固定包含10个线程的线程池ExecutorService threadPool = Executors.newFixedThreadPool(10);//像线程池里添加任务threadPool.submit(new Runnable() {@Overridepublic void run() {System.out.println("hello");}});}

2.剖析线程池

ExecutorService threadPool = Executors.newFixedThreadPool(10);
大家一定对这个创建线程池的语句有疑问。

ExecutorService翻译一下,差不多就是执行服务,也就是说这个类是用来执行服务的,用来服务线程池的。

在这里插入图片描述
而这种创建方式,就是 工厂模式 🏭,用来弥补构造方法的不足(参数列表相同,但是要实现的功能不同时,因此这两个功能无法同时存在,因此就用两个方法名不同的静态方法来实现),感兴趣的朋友也可以去深入了解一下🎗️。


🧑🏻‍💻最原装的线程池对象是 ThreadPoolExecutor
上述工厂方法是对这个对象的进一步封装。

🎉俗话说得好,万变不离其宗,所以今天就来讲解一下这个原装的线程池对象。

在这里插入图片描述

上图是原装线程池的四个构造方法,咱们就讲第四个构造方法,它的参数最全,覆盖了上面三个构造方法的所有参数。


1️⃣ 第一个参数:int corePoolSize,核心线程的数量。
核心线程就相当于有编制的正式员工,无论有没有任务,忙不忙,都不会把这个员工辞退,也就是说核心线程不会被销毁,他会伴随线程池的整个生命周期, corePoolSize用来规定核心线程的数量

2️⃣ 第二个参数:int maximumPoolSize,最大线程数。
线程数=核心线程+临时线程 ,当任务比较多,比较忙的时候,线程池就会创建一些临时线程(临时工)来帮忙,当不忙了,闲了,把临时线程销毁(辞退临时工)。 maximumPoolSize用来规定线程池中最多有多少个线程

3️⃣ 第三个参数:long keepAliveTime,临时线程的存活时间。
当不忙之后,核心线程可以忙的过来之后,不会理解销毁临时线程,而是会等待一段时间,如果这段时间又忙起来,就还接着用这些临时线程,如果这段时间都不忙那么就销毁这些临时线程, keepAliveTime用来规定不忙之后,临时线程的最大存活时间

4️⃣第四个参数:TimeUnit unit。
规定参数keepAliveTime的单位(毫秒,秒,分…)

5️⃣第五个参数:BlockingQueue workQueue,存放任务的阻塞队列。
线程池要管理很多任务,这些任务通过这个阻塞队列来组织, 程序员可以手动给线程池指定一个队列 ,就更加便于程序员控制获取队列中的信息,submit方法就是将任务放进这个队列里。

6️⃣第六个参数:ThreadFactory threadFactory。
这是一个工厂类,与之前的工厂模式类似,就是用来辅助线程池创建线程的辅助类

7️⃣第七个参数:RejectedExecutionHandler handler。
线程池的拒绝策略。 如果线程池满了,仍继续往里添加任务,如何拒绝添加


3.线程池的拒绝策略

标准库一共为线程池提供了四种拒绝策略
在这里插入图片描述


大前提:任务队列已经满了,还添加任务

  1. 第一种策略:AbortPolicy。
    直接抛出异常
  2. 第二种策略:CallerRunsPolicy。
    哪个线程添加的这个任务,就 让这个线程自己去执行这个任务
  3. 第三种策略:DiscardOldestPolicy。
    丢弃最老的任务 (阻塞队列中位于队首的任务)
  4. 第四种策略:DiscardPolicy。
    丢弃最新的任务 (阻塞队列中位于队尾的任务,也就是直接丢弃这个要添加的新任务)。

假设,你的任务列表容量大小为3,只能同时记住三件事,
1.第一件事:吃饭🍚
2.第二件事:打CSGO🎮
3.第三件事:敲代码🧑🏻‍💻
这时你的女朋友给你发微信,让你去帮她拿个快递。

四种拒绝策略分别会怎么做呢???

  1. 第一种策略,我让我自己嘎☠️,什么都不做了。
  2. 第二种策略,我记不住这第四件事了,女朋友让我去拿,她让我去,那就让她自己去拿。💢(这个任务谁添加的谁来执行)
  3. 第三种策略,😵丢弃吃饭(抛弃队首任务),记住帮女朋友拿快递
  4. 第四种策略,😵假装没看见微信,不管这个事,爱拿不拿。(抛弃队尾任务)

三、代码模拟实现线程池

public class MyThreadPool {// 阻塞队列存放任务private BlockingDeque<Runnable> queue = new LinkedBlockingDeque<>();// 存放任务的方法public void subMit(Runnable runnable) throws InterruptedException {queue.put(runnable);}// 此处实现一个固定线程数的线程池public MyThreadPool (int n) {for (int i = 0; i < n; i++) {Thread thread = new Thread(()->{try {while (true) {// 此处需要让每个线程内部都有 while 循环, // 不停的从阻塞队列当中取任务,执行任务Runnable runnable = queue.take();runnable.run();}} catch (InterruptedException e) {e.printStackTrace();}});thread.start();}}
}

总结

以上就是今天要讲的内容,本文介绍了线程池及其使用方法,更介绍了其中重要的四种拒绝策略,还用代码模拟实现了线程池而,今天的内容理论较多,代码实现比较简单,望大家慢慢品味。

路漫漫不止修身,也养性。

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

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

相关文章

Python 基本数据类型(五)

文章目录 每日一句正能量List&#xff08;列表&#xff09;结语 每日一句正能量 营造良好的工作和学习氛围&#xff0c;时刻牢记宗旨&#xff0c;坚定信念&#xff0c;胸怀全局&#xff0c;埋头苦干&#xff0c;对同事尊重信任谅解&#xff0c;发扬团体协作精神&#xff0c;积极…

使用Xshell服务器跑程序,用pycharm连接服务器远程开发

目标&#xff1a; 1.使用Xshell在服务器上创建自己项目需要的虚拟环境 2.用pycharm实现远程服务器的连接&#xff08;这样就可以在本地debug或者写代码&#xff0c;然后再用xshell在服务器上跑&#xff09; 一、使用Xshell在服务器上创建自己项目需要的虚拟环境 1.打开Xshe…

如何在 Linux 中安装、设置和使用 SNMP?

概要 SNMP&#xff08;Simple Network Management Protocol&#xff09;是一种用于管理和监控网络设备的协议。它允许网络管理员通过远程方式收集设备的运行状态、性能数据和错误信息&#xff0c;以便进行故障排除和网络优化。在Linux系统中&#xff0c;我们可以安装、设置和使…

Java调用ssl异常,javax.net.ssl.SSLHandshakeException: No appropriate protocol

现象&#xff1a;sqlserver 2017 安装在docker里&#xff0c;系统是mac 13&#xff0c;java 1.8.371运行java程序提示上面ssl错误&#xff0c;根据百度提供的方法&#xff0c;修改文件&#xff0c;重启程序搞定。 解决办法&#xff1a;java.security 找到这个文件修改保存 发…

MySQL-SQL存储过程/触发器详解(上)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️努力不一定有回报&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xf…

点云配准综述一篇综述《A comprehensive survey on point cloud registration》(翻译)

参照了 2021最新关于点云配准的全面综述 - 知乎&#xff0c;并且加了些自己翻译&#xff0c;全篇的内容可能稍有删减。主要作为个人笔记&#xff0c;阅读了几篇综述&#xff0c;发现这篇是质量较好的&#xff0c;值得花时间细读。 文章分类 文章将配准方法分为了同源配准和不…

基于Python的电影票房爬取与可视化系统的设计与实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

【Linux】深入理解文件系统

系列文章 收录于【Linux】文件系统 专栏 关于文件描述符与文件重定向的相关内容可以移步 文件描述符与重定向操作。 可以到 浅谈文件原理与操作 了解文件操作的系统接口。 想深入理解文件缓冲区还可以看看文件缓冲区。 目录 系列文章 磁盘 结构介绍 定位数据 抽象管理…

springboot+vue在线考试系统(java项目源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的在线考试系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风歌&a…

Vue3+Vite+TypeScript常用项目模块详解

目录 1.Vue3ViteTypeScript 概述 1.1 vue3 1.1.1 Vue3 概述 1.1.2 vue3的现状与发展趋势 1.2 Vite 1.2.1 现实问题 1.2 搭建vite项目 1.3 TypeScript 1.3.1 TypeScript 定义 1.3.2 TypeScript 基本数据类型 1.3.3 TypeScript语法简单介绍 2. 项目配置简单概述 2.…

容智信息荣获2023第三届中国RPA+AI开发者大赛多项大奖

近日&#xff0c;历时数月的「2023第三届中国RPAAI开发者大赛」在苏州圆满收官。本次大赛由RPA中国联合全球人工智能产品应用博览会主办&#xff0c;容智信息作为顶级联合主办单位&#xff0c;主旨挖掘人才&#xff0c;促进RPA和AI技术在社会各领域的融合性应用。 这次大赛的主…

基于深度学习的高精度抽烟行为检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度抽烟行为检测识别系统可用于日常生活中或野外来检测与定位抽烟行为目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的抽烟行为目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5…