线程池的创建方式

线程池的创建方式:

1、newCachedThreadPoo:

创建一个可缓存的线程池,当线程池的线程数量超过任务数量时,自动回收空闲线程,当线程当任务数量超过线程池的线程数量时,自动添加新线程;

ExecutorService executor = Executors,newCachedThreadPool();
for (int i = 0;i < 10; i++) {//模拟10个任务executor.submit(new Runnable() {@Overridepublic void run() {// 线程执行的代码}});
executor.shutdown () ;

2、newFixedThreadPool(int n)

创建一个固定大小的线程池,线程数量固定为n,当任务数量超过线程池的线程数量时,任务会被放在任务队列中等待执行。

ExecutorService executor = Executors.newFixedThreadPool(5);
for (int i = 0; i< 10; i++) {//模拟10个任务executor.submit (new Runnable () {@Overridepublic void run() {// 线程执行的代码}    });
}
executor.shutdown () ;

3、newSingleThreadExecutorl :

创建一个单线程的线程池,所有任务都在同一个线程中,顺序执行。

ExecutorService executor = Executors.newSingleThreadExecutor();
for (int i = 0;< 10; i++) {
//模拟10个任务
executor.submit (new Runnable(){ 
@Override
public void run() {// 线程执行的代码}});
}
executor.shutdown ();

4、newScheduledThreadPool(int corePoolSize)

ScheduledExecutorService executor =Executors.newScheduledThreadPoo1(2);
for (int i = 0;i < 10; i++) {
//模拟10个任务
executor.schedule(new Runnable () {@Overridepublic void run{// 线程执行代码} },5,TimeUnit.SECONDS);
}
executor.shutdown () ;

建一个定时任务的线程池,可以在指定的时间间隔内周期性的执行任务,在阿里巴巴这么开发手册中,建议开发者手动创建线程。

[强制]线程池不允许使用 Executors 去创建,而是通过ThreadPoolExecutor的方式,这4样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。
说明: Executors 返回的线程池对象的弊端如下1)FixedThreadPool和 SinaleThreadPool :
允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM2)CachedThreadPool :
允许的创建线程数量为 Integer.MAX_VALUE,可能会创建大量的线程,从而导致 OOM

这是因为Executors工具类虽然提供了一些便利的方法来创建线程池,这些方法并没有很好的考虑到线程池的使用场景和实际需求,容易导致线程池的滥用。进而引发各种问题;

我们可以通过ThreadPoolExecutor手动创建:

自定义设置参数:

corePoolSize :线程池的核心线程数,即在没有任务需要执行时线程池的大小

maximumPoolSize:线程池最大能够容纳的线程数,当线程池的工作队列已满并且仍有新的任务到来时,线程池就会创建新的线程,直到达到该参数指定的上限;

keepAliveTime: 当线程池中线程数量超过核心线程数时,这时多余的空闲线程在终止之前等待新任务的最长时间

unit,keepAliveTime:参数的时间单位

workQueue:任务队列,用于存放等待执行的任务

threadFactory:线程工厂,用于创建新线程的工厂

handler:拒绝策略,当线程池无法处理新任务时的处理方式

ExecutorService threadPool = new ThreadPoolExecutor(2,// 核心线程数10,// 最大线程数2L,//空闲线程存活时间TimeUnit.SECONDS,// 空闲线程活跃时间单位new LinkedBlockingQueue<Runnable>(5),// 线程池任务队列Executors.defaultThreadFactory()// 默认线程工厂new ThreadPoolExecutor.AbortPolicy() // 拒绝策略);try {for (int i = 0;< 10; i++) { // 模拟10个用户来办理业务threadPool.execute(() ->{// 线程要执行的任务; });}} catch (Exception e) {e.printstackTrace() ;} finally {threadPool.shutdown(); // 关闭线程池}

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

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

相关文章

详解数据在内存中的存储

系列文章目录 第一章 C语言基础知识 第二章 C语言控制语句 第三章 C语言函数详解 第四章 C语言数组详解 第五章 C语言操作符详解 第六章 C语言指针详解 第七章 C语言结构体详解 文章目录 1. 数据类型 1.1 基本数据类型 1.2 派生数据类型 2. 整形在内存中的存储 2.1 …

基于ssm汽车租赁系统业务管理子系统论文

系统简介 随着信息互联网购物的飞速发展&#xff0c;一般企业都去创建属于自己的管理系统。本文介绍了汽车租赁系统业务管理子系统的开发全过程。通过分析企业对于汽车租赁系统业务管理子系统的需求&#xff0c;创建了一个计算机管理汽车租赁系统业务管理子系统的方案。文章介…

“手撕“三大特性之一的<继承>(上)

目录 一、为什么需要继承 二、什么是继承 三、继承怎么写 四、成员的访问 1.父类与子类的成员变量不同名 2.父类与子类的成员变量同名 3.父类与子类的成员方法不同名 4.父类与子类的成员方法同名 五、super关键字 一、为什么需要继承 先让我们看一段Java代码&#…

数据结构-基于ArrayList的源码模拟

文章目录 继承关系 :1. 构造方法的模拟2. 扩容机制的分析3. 查找方法的模拟4. 获取,修改元素的方法模拟5. 添加元素的模拟6. 删除元素的模拟7. removeAll与retainAll的模拟总结: 边缘方法以及总代码 继承关系 : 1. 构造方法的模拟 源码中我们的ArrayList的构造方法给出了三种实…

Linux:常用软件、工具和周边知识介绍

上次也是结束了权限相关的知识&#xff1a;Linux&#xff1a;权限相关知识详解 文章目录 1.yum-管理软件包的工具1.1基本介绍1.2yum的使用1.3yum的周边生态1.4软件包介绍 2.vim-多模式的文本编辑器2.1基本介绍2.2基本模式介绍2.2.1命令模式&#xff08;Normal mode&#xff09;…

Vue【路由】

1&#xff1a;什么是单页应用程序&#xff08;single page application&#xff09; 所有得功能在一个html页面上实现 2&#xff1a;单页面应用程序的优缺点 优点&#xff1a;按需更新性能高&#xff0c;开发效率也高&#xff0c;用户的体验较好 缺点&#xff1a;学习成本高…

QA | ZStack替代VMware实问实答

3月27日&#xff0c;ZStack以“帮用户算笔账”为主题的线上VMware替代升级解决方案研讨直播顺利举行&#xff0c;直播就VMware采用订阅制后&#xff0c;用户如何选择虚拟化替代升级方案做了充分的讲解&#xff0c;有近700名伙伴和用户参与了我们的直播活动&#xff0c;并提出了…

spring的redis注解@Cacheable @Cacheput @CacheEvict的condition、unless

概述 redis的注解使用的过程中总会遇到condition和unless这两个属性&#xff0c;而且不同的注解使用注意事项不一样。本人也是错误使用之后详细查询了一下&#xff0c;作了如下的总结。 Cacheale 这个注解的使用和意义这里不多说&#xff0c;可以查看我的其他文档。这里主要说…

Docker 部署 jenkins 并正确迁移到新服务器

问题&#xff1a; docker 部署的 jenkins 在迁移时如果只迁移 jenkins_home 目录到新服务器上&#xff0c;在新服务器上部署 jenkins 后在使用中会遇到任务无法正常构建、系统奔溃报错。解决办法就是将镜像也一并迁移。 镜像迁移 旧服务器导出镜像 # 根据容器创建新镜像 dock…

java:Java中的抽象类

什么是抽象类&#xff1a; 我们知道&#xff0c;类用来模拟现实的事物&#xff0c;一个类模拟一类事物&#xff0c;某个类的一个实例化对象可以模拟某个属于该类的具体事物。类中描绘了该类所有对象的共同的特性&#xff0c;当一个类中给出的信息足够全面时候&#xff0c;我们就…

docker灵活部署mysql

博客简要 用docker部署mysql,并将数据库映射到主机上&#xff0c;并增加远端访问mysql数据库 当你使用Docker运行MySQL时&#xff0c;并且希望将MySQL数据库的数据存储在宿主机&#xff08;也就是运行Docker的主机&#xff09;上的特定路径&#xff0c;你需要在启动容器时通过…

Axure设计原型图工具 Windows11安装步骤详解

文章目录 目录 文章目录 安装流程 小结 概要安装流程技术细节小结 概要 Axure 是一个流行的原型设计工具&#xff0c;它被用来创建交互式原型、线框图和用户界面设计。Axure 可以帮助用户在项目早期阶段快速制作出可交互的原型&#xff0c;以便进行用户测试、验证设计概念和与…

机器学习和深度学习--李宏毅(笔记与个人理解)Day17

Day 17Convolutional Neyral Network (CNN) 卷积神经网络一般都用在image 上面比较多一些&#xff0c;所以课程的例子大多数也都是image Image Classification the same size how about for pc? 这里对于tensor 张量这个概念&#xff0c;我还是比较奇怪&#xff0c;在我认为一…

github上传代码

偷一下懒&#xff0c;把链接贴一下&#xff0c;后续再补充。 1.下载Git 【学习笔记】上传代码到GitHub&#xff08;保姆级教程&#xff09; 2.如何创建GitHub仓库 手把手教你在github上传文件 3.如何删掉GitHub仓库 github如何删除仓库或项目&#xff1f; 4.遇到的错误 …

ssm 体检预约管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 ssm 体检预约管理系统是一套完善的信息系统&#xff0c;结合springMVC框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c; 系统主要采用B/S…

JET毛选学习笔记:如何利用《实践论》学习实验

一、个人背景介绍 本人本科读的是预防医学专业&#xff08;因为没考上临床&#xff09;&#xff0c;硕博连读&#xff08;报名人少&#xff0c;我报了就得了&#xff09;的时候专业是流行病与卫生统计学&#xff0c;除了学习流行病学、统计学&#xff08;忘得差不多了&#xf…

2024-4-19 群讨论:JVM 堆外内存如何查看?

以下来自本人拉的一个关于 Java 技术的讨论群。关注公众号&#xff1a;hashcon&#xff0c;私信进群拉你 JVM 堆外内存如何查看&#xff1f; 参考&#xff1a;https://juejin.cn/post/7225871227743043644 分为&#xff1a; 通过 Native Memory Tracking 能看到的&#xff1…

【C++】:函数重载,引用,内联函数,auto关键字,基于范围的for循环,nullptr关键字

目录 一&#xff0c;函数重载1.1 函数重载的定义1.1.1.形参的类型不同1.1.2参数的个数不同1.1.3.参数的顺序不同1.1.4.有一个是缺省参数构成重载。但是调用时存在歧义1.1.5.返回值不同&#xff0c;不构成重载。因为返回值可接收&#xff0c;可不接受&#xff0c;调用函数产生歧…

竞争性自适应加权抽样结合偏最小二乘回归(CARS-PLS)在多变量分析中的应用(附MATLAB软件包)

竞争性自适应加权抽样结合偏最小二乘回归(CARS-PLS)在多变量分析中的应用 引言 在现代科学研究中,高维数据分析是一个日益重要的课题。由光谱学、色谱学和其他高通量测量技术产生的数据集通常包含大量的冗余和噪声,这给模型建立和预测带来了挑战。竞争性自适应加权抽样结…

二分答案复习

y总二分查找算法模板 int bsearch_1(int l, int r) {while (l < r){int mid l r >> 1;//性质在右边&#xff0c;区间划分成[l, mid]和[mid 1, r]if (check(mid)) r mid;else l mid 1;}return l; }int bsearch_2(int l, int r) {while (l < r){int mid l r …