【多线程】线程池的简单实现与线程池的拒绝策略

目录

一、为什么使用线程池

二、标准库中的线程池

三、线程池的简单代码实现

四、标准库中线程池的构造方法解读

五、拒绝策略


一、为什么使用线程池

如果有多个线程,一个一个的去创建则需要从就绪状态被调度到运行状态不断切换然后死亡,这样的情况成本比较高。所以频繁的开启或停止线程,线程需要重新被CPU调度到运行状态,需要发生CPU的上下文切换,效率比较低。而线程池是复用机制,它会提前创建好一些固定的进入运行状态的线程,从而减少就绪状态到运行状态的切换

二、标准库中的线程池

    public static void main(String[] args) throws InterruptedException {// 1. 创建线程池ExecutorService pool = Executors.newCachedThreadPool();// 2. 提交任务pool.submit(new Runnable() {@Overridepublic void run() {System.out.println("线程1");	}});}

三、线程池的简单代码实现

一个线程池可以同时提交n个任务,在线程池中会有m个线程去执行这n个任务,我们可以基于生产者消费者模型来实现线程池,首先我们需要一个阻塞队列来存储提交的任务,然后在构造方法中创建出m个线程去执行这些任务

class Pool {// 1. 创建阻塞队列private BlockingQueue<Runnable> queue = new ArrayBlockingQueue<Runnable>(10);// 2. 提交任务public void submit(Runnable task) throws InterruptedException {queue.put(task);}// 3. 构造方法中创建出线程public Pool (int m) {for (int i = 0; i < m; i++) {Thread t = new Thread() {@Overridepublic void run() {while (true) {try {queue.take().run();} catch (InterruptedException e) {e.printStackTrace();}}}};t.start();}}
}

四、标准库中线程池的构造方法解读

我们先来看一下线程池的核心构造方法

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,RejectedExecutionHandler handler) {this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,Executors.defaultThreadFactory(), handler);
}

其中第一次个参数corePoolSize表示线程池里核心线程数的个数,第二个参数表示线程池中最大线程数,既然有了核心线程数那么为什么会有最大线程数呢?举个例子,一个公司在任务不多的情况下可能只需要核心的员工就够了,但是忽然有一天任务忽然增多原有的核心员工不够了这个时候就会招聘对应数量的实习生来执行这些任务,最大线程数就是核心线程数加上临时的线程数,那接下来的两个参数也是针对这些“实习生”的,他表示当任务不紧急的多久时间后销毁这些线程,第五个参数也就是workQueue,在上面线程池的实现中我们了解了在线程池中有一个专门存储任务的任务队列,这个参数也是一个任务队列,在创建线程池的时候你可以选择传入一个自己的任务队列,也可以选择不传入,就好比大一新生开学你可以选择学校提供的被褥也可以选择自带被褥,关于最后一个参数handler,他是用于选择线程池使用哪一个拒绝策略的,会在下面提到

五、拒绝策略

什么是线程池的拒绝策略呢?当线程池中的任务队列已经满了时,再有新的任务提交进来时线程池会根据不同的拒绝策略采取不同的措施》》》

  • ThreadPoolExcutor.AbortPolicy:直接抛出异常,之前的任务也会停止
  • ThreadPoolExcutor.CallerRunsPolicy:将任务交给调用者去执行,如果调用者执行不了,该任务会被丢弃
  • ThreadPoolExcutor.DiscardoldestPolicy:将最老的任务丢弃来执行新的任务,执行完成后再去执行老的任务
  • ThreadPoolExcutor.DiscarPolicy:先继续执行之前的任务,后续再去执行新提交的任务

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

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

相关文章

基于Linux的智能家居(工厂模式)

目录 1.项目概述 2.程序框架 3.函数准备 3.1需要函数知识点 3.2编码提醒 4.代码 5.注意事项 1.项目概述 控制端有两个&#xff0c;语音串口UART和Tcp通讯。 执行端有IO输出和IO输入。 2.程序框架 程序分为3部分-------------1.输入控制 2.输出设备 3.主函数-多线程…

h5上传图片并裁剪

本文主要实现&#xff0c;h5通过input上传图片后&#xff0c;利用cropperjs进行裁剪&#xff0c;获取指定尺寸 1 安装cropperjs npm install cropperjs 2 具体实现 home.jsx 代码中的result模块用来展示最终的裁剪结果&#xff1b;mask用作页面最上层蒙层&#xff0c;用来裁…

文件上传漏洞案例

目录 1.案例一 1&#xff09;案例源码 2&#xff09;创建web.php文件 3&#xff09;使用抓包软件 2.案例二 1&#xff09;案例代码 2&#xff09; 案例分析 3&#xff09;copy命令生成图片马 4&#xff09;上传图片马到服务器 5&#xff09;解析 文件图片 3.案例三 …

计算机系统的基本概念

计算机系统的基本概念 本文主要以hello.c这个程序的整个生命周期来简单了解一下计算机系统结构的基本概念。 #include <stdio.h>int main() {printf("hello, world\n");return 0; }gcc hello.c -o hello ./hello hello, world此刻&#xff0c;hello.c源程序…

【瑞萨零基础入门】瑞萨MCU零基础入门系列教程(更新连载中)

瑞萨MCU零基础入门系列教程 前言 得益于瑞萨强大的MCU、强大的软件开发工具(e studio)&#xff0c;也得益于瑞萨和RA生态工作室提供的支持&#xff0c;我们团队编写了《ARM嵌入式系统中面向对象的模块编程方法》&#xff0c;全书37章&#xff0c;将近500页: 讲解面向对象编程…

访问局域网内共享文件时报错0x80070043,找不到网络名

我是菜鸡 此篇只为分享一个我遇到的很简单的但是排查了好久的小问题。 我的网络环境是在校园网内&#xff0c; 自己的办公电脑设置了固定IP&#xff1a;10.11.128.236&#xff0c;同事电脑IP为&#xff1a;10.11.128.255 本人需要访问同事在局域网内分享的文件&#xff0c;…

ES索引修改mappings与重建reindex详解之修改字段类型

文章目录 概要一、创建索引1.1、获取mappings 二、新增字段修改mappings三、修改OR删除mappings已有字段3.1、创建新索引&#xff0c;将要改字段加进去3.2、同步数据3.3、删除原索引并对新索引重命名3.4、同步数据的技巧 四、参考文献 概要 elasticsearch一直在使用&#xff0…

【Python爬虫实战】爬虫封你ip就不会了?ip代理池安排上

前言 在进行网络爬取时&#xff0c;使用代理是经常遇到的问题。由于某些网站的限制&#xff0c;我们可能会被封禁或者频繁访问时会遇到访问速度变慢等问题。因此&#xff0c;我们需要使用代理池来避免这些问题。本文将为大家介绍如何使用IP代理池进行爬虫&#xff0c;并带有代…

波奇学C++:多态知识点

多态中函数的重写&#xff08;基类指针访问派生类函数&#xff09;&#xff0c;只重写函数的实现&#xff0c;而不重写声明。 class Person { public:virtual void fun(int i 0){cout << "Person"<<" "<<i;} }; class Student:public …

命令执行漏洞(附例题)

一.原理 应用有时需要调用一些执行系统命令的函数&#xff0c;如PHP中的system、exec、shell_exec、passthru、popen、proc_popen等&#xff0c;当用户能控制这些函数的参数时&#xff0c;就可以将恶意系统命令拼接到正常命令中&#xff0c;从而造成命令执行攻击。 二.利用条…

Linux平台如何实现采集音视频数据并注入轻量级RTSP服务?

技术背景 好多开发者&#xff0c;问我们最多的问题是&#xff0c;为什么要设计轻量级RTSP服务&#xff1f;轻量级RTSP服务&#xff0c;和RTSP服务有什么区别&#xff1f; 针对这个问题&#xff0c;我们的回答是&#xff1a;轻量级RTSP服务解决的核心痛点是避免用户或者开发者…

dll修复精灵,dll修复工具下载方法分享,mfc140u.dll缺失损坏一键修复

今天&#xff0c;我将为大家分享一个关于mfc140u.dll的问题。首先&#xff0c;我想问一下在座的网友们&#xff0c;有多少人知道mfc140u.dll是什么&#xff1f;又有多少人知道它的作用以及如何解决这个问题呢&#xff1f;在接下来的演讲中&#xff0c;我将详细介绍mfc140u.dll的…

transition-group过渡动画

安装lodash库 cnpm install lodash -S 安装lodash-type cnpm install types/lodash -D <template><div><button click"random">random</button><transition-group move-class"mmm" class"wraps" tag"div&qu…

C#使用proto

写多了go代码&#xff0c;被go mod tidy惯坏了&#xff0c;还以为全天下的都很好用呢&#xff0c;结果发现并不是这样。尤其是项目组的proto还是又封了个工具直接就能跑得&#xff0c;导致以为没那么复杂的事情变得复杂了起来。是有两套生成的规则&#xff0c;时间有点晚&#…

vue-router路由守卫

vue-router 提供的导航守卫主要用来通过跳转或取消的方式守卫导航分为&#xff1a;全局的&#xff0c;单个路由独享的和组件级的。 一、全局路由守卫1、全局前置守卫 beforeEach 在全局前置守卫中&#xff0c;我们可以访问到即将要进入的路由对象 to&#xff0c;以及当前的路由…

虹科分享 | 解决外科医生的担忧:AR让技术自己开口说话

在手术室中&#xff0c;分心可能导致严重错误和伤害&#xff0c;这凸显了在手术过程中减少对外科医生干扰的重要性。对于外科医生来说&#xff0c;在长时间的手术过程中&#xff0c;引入新技术设备时需要考虑多种因素。根据Vuzix对500多名外科医生的综合调查显示&#xff0c;使…

LeetCode 865. Smallest Subtree with all the Deepest Nodes【树,DFS,BFS,哈希表】1534

本文属于「征服LeetCode」系列文章之一&#xff0c;这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁&#xff0c;本系列将至少持续到刷完所有无锁题之日为止&#xff1b;由于LeetCode还在不断地创建新题&#xff0c;本系列的终止日期可能是永远。在这一系列刷题文章…

MFC中的Button修改颜色的方法

添加工具箱下面的MFC Button Control控件&#xff08;不使用普通的Button控件&#xff09;&#xff1b;给按键添加变量&#xff1a;m_MFCButton1&#xff0c;变量类型&#xff08;默认&#xff09;为&#xff1a;CMFCButton&#xff1b;testDlg.cpp中初始化中添加如下代码&…

GO语言常用标准库 fmt

GO语言常用标准库 fmt 1. fmt fmt包实现了类似C语言printf和scanf的格式化I/O。主要分为向外输出内容和获取输入内容两大部分。 1.1.1. 向外输出 标准库fmt提供了以下几种输出相关函数。 Print Print系列函数会将内容输出到系统的标准输出&#xff0c;区别在于Print函数直…

机械零件保养3d模拟演示打消客户购买顾虑

复杂机械的工作运转是复杂的&#xff0c;想要对机械有深度的理解和迭代&#xff0c;必须了解它的运转原理及参数&#xff0c;复杂机械运行原因教学存在着不可视、系统庞杂及知识点多等弊病&#xff0c;3D虚拟展示是基于web3d网页运行的三维页面&#xff0c;可以将复杂机械运行过…