线程池ThreadPoolExecutor详解

线程池ThreadPoolExecutor详解

大家好,我是微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天,让我们深入研究Java中线程池的强大工具——ThreadPoolExecutor,解析它的工作原理、配置参数以及在多线程开发中的应用。

为什么需要线程池?

在并发编程中,创建和管理线程是一项资源消耗较大的任务。频繁地创建和销毁线程不仅会增加系统开销,还容易导致资源耗尽、性能下降等问题。线程池的出现正是为了解决这些问题,通过对线程的重用和管理,提高了系统的性能和稳定性。

ThreadPoolExecutor的基本概念

ThreadPoolExecutor是Java中线程池的一个实现类,它提供了丰富的配置选项,可以灵活地控制线程池的行为。在使用ThreadPoolExecutor之前,我们先了解一下它的基本概念。

1. 核心池大小(corePoolSize)

核心池大小是线程池中保持活动状态的最小线程数。即使线程处于空闲状态,核心池中的线程也会被保持活动,不会被回收。新的任务会尽可能地由核心池中的线程来执行。

2. 最大池大小(maximumPoolSize)

最大池大小是线程池中允许存在的最大线程数。当核心池中的线程都处于忙碌状态,并且任务队列已满时,线程池会创建新的线程,直到达到最大池大小。

3. 任务队列(workQueue)

任务队列用于存储等待执行的任务。当任务提交到线程池,但线程池中的线程数已达到核心池大小时,任务会被存储在任务队列中。ThreadPoolExecutor提供了多种任务队列的实现,如LinkedBlockingQueueArrayBlockingQueue等。

4. 线程存活时间(keepAliveTime)

线程存活时间是线程在空闲状态下的最大存活时间。当线程池中的线程数超过核心池大小,空闲的线程在经过一段时间后会被回收,直到线程数减少到核心池大小。

5. 拒绝策略(RejectedExecutionHandler)

当任务无法被线程池执行时,会触发拒绝策略。ThreadPoolExecutor提供了多种拒绝策略的实现,如AbortPolicyCallerRunsPolicy等。

ThreadPoolExecutor的使用示例

以下是一个简单的ThreadPoolExecutor的使用示例:

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;public class ThreadPoolExample {public static void main(String[] args) {// 创建ThreadPoolExecutorThreadPoolExecutor executor = new ThreadPoolExecutor(2,                    // 核心池大小5,                    // 最大池大小1,                    // 线程存活时间TimeUnit.MINUTES,     // 存活时间单位new ArrayBlockingQueue<>(10),  // 任务队列new ThreadPoolExecutor.AbortPolicy() // 拒绝策略);// 提交任务for (int i = 0; i < 20; i++) {final int taskId = i;executor.submit(() -> {System.out.println("Task " + taskId + " is running on thread " + Thread.currentThread().getName());try {Thread.sleep(1000); // 模拟任务执行时间} catch (InterruptedException e) {e.printStackTrace();}});}// 关闭线程池executor.shutdown();}
}

在这个例

子中,我们创建了一个ThreadPoolExecutor,设置了核心池大小为2,最大池大小为5,线程存活时间为1分钟,任务队列使用了ArrayBlockingQueue,拒绝策略为AbortPolicy。随后,我们提交了20个任务到线程池中。

ThreadPoolExecutor的常见配置和调优建议

在实际项目中,合理的配置线程池对于系统的性能和稳定性至关重要。以下是一些建议:

1. 核心池大小的设置

核心池大小决定了线程池中保持活动状态的最小线程数。根据实际情况,可以根据系统的负载和性能需求合理设置核心池大小。如果系统的并发负载较大,可以适当增加核心池大小。

2. 最大池大小的设置

最大池大小决定了线程池中允许存在的最大线程数。在设置最大池大小时,需要考虑系统的硬件资源和性能需求。过大的最大池大小可能导致系统资源耗尽,过小的最大池大小则可能影响系统的并发性能。

3. 任务队列的选择

ThreadPoolExecutor提供了多种任务队列的实现,如LinkedBlockingQueueArrayBlockingQueue等。选择适合业务场景的任务队列可以有效控制任务的排队和执行顺序。

4. 拒绝策略的选择

当任务无法被线程池执行时,会触发拒绝策略。根据业务场景和需求,选择适合的拒绝策略。常见的拒绝策略有AbortPolicy(抛出异常)、CallerRunsPolicy(在提交任务的线程中执行任务)、DiscardPolicy(直接丢弃任务)等。

5. 线程存活时间的设置

线程存活时间决定了线程在空闲状态下的最大存活时间。合理设置线程存活时间可以防止线程池中的线程无限增长,有效控制系统的资源消耗。

6. 使用合适的工作队列大小

任务队列的大小决定了可以存储多少个等待执行的任务。根据系统的并发负载和任务处理能力,选择适合的工作队列大小,避免任务阻塞或过多任务排队。

总结

ThreadPoolExecutor是Java中强大而灵活的线程池实现,通过适当的配置,可以有效地提高系统的性能和稳定性。希望通过本文的介绍,你对ThreadPoolExecutor有了更深入的了解,并能够在实际项目中灵活应用。

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

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

相关文章

[Vulnhub靶机] DC-1

[Vulnhub靶机] DC-1靶机渗透思路及方法&#xff08;个人分享&#xff09; 靶机下载地址&#xff1a; https://download.vulnhub.com/dc/DC-1.zip 靶机地址&#xff1a;192.168.67.25 攻击机地址&#xff1a;192.168.67.3 一、信息收集 1.使用 arp-scan 命令扫描网段内存活的…

html的学习笔记

开发工具&#xff1a;vscode 文字标签 h1:一级标题&#xff0c;h2&#xff1a;二级标题h6 p&#xff1a;段落标签 hr&#xff1a;分隔线 br&#xff1a;换行 strong/b&#xff1a;文字加粗 ins/u:下划线 em/i&#xff1a;倾斜 del/s&#xff1a;删除线 媒体标签 图片…

vue中使用ailwind css

官网地址&#xff1a; 安装 - Tailwind CSS 中文网 推荐一个网站&#xff0c;里面可以查询所有的TailWindCSS的class样式&#xff1a; Tailwind CSS Cheat Sheet npm安装&#xff1a; 注意&#xff1a;1、这里要用npm&#xff0c;不要用cnpm。2、最好用install&#xff0c;不要…

泛型的相关内容

首先我们来了解一下什么是泛型&#xff0c;泛型的作用又是什么。 泛型的形式是 ArrayList<Object> objects new ArrayList<>(); 这里的<Object>这个就是泛型&#xff0c;添加泛型的作用又是什么呢&#xff0c;它可以限制添加对象的类型&#xff0c;比如A…

黑马点评05分布式锁 1互斥锁和过期时间

实战篇-09.分布式锁-基本原理和不同实现方式对比_哔哩哔哩_bilibili 1.分布式锁 因为jvm内部的sychonized锁无法在不同jvm之间共享锁监视器&#xff0c;所以需要一个jvm外部的锁来共享。 2.redis setnx互斥锁 加锁解锁即可 2.1不释放锁可能死锁 redis 的setnx不会自动释放锁…

Crow:黑魔法 添加路由2 new_rule_tagged实现模板参数的绑定

Crow添加路由的定义: #define CROW_ROUTE(app, url) app.template route<crow::black_magic::get_parameter_tag(url)>(url) Crow:黑魔法get_parameter_tag-CSDN博客 介绍了get_parameter_tag的作用 route的定义为: auto route(std::string&& rule) -> …

微信小程序生成二维码海报并分享

背景&#xff1a;点击图标&#xff0c;生成海报后&#xff0c;点击保存相册&#xff0c;可以保存 生成海报&#xff1a;插件wxa-plugin-canvas&#xff0c;此处使用页面异步生成组件方式&#xff0c;官网地址&#xff1a;wxa-plugin-canvas - npm 二维码&#xff1a;调用后端…

用CC三维建模建出的OSGB格式,用模方打不开,显示该路径包含OSGB瓦块数量0,是什么原因?

答&#xff1a;模方只识别tile命名的模型文件&#xff0c;此模型是不分块输出&#xff0c;要平面切块重新跑。 模方是一款针对实景三维模型的冗余碎片、水面残缺、道路不平、标牌破损、纹理拉伸模糊等共性问题研发的实景三维模型修复编辑软件。模方4.1新增自动单体化建模功能&…

巴贝拉葡萄酒是单一品种还是混合品种制成的?

大多数巴贝拉葡萄酒都是由单一的巴贝拉葡萄品种制成的&#xff0c;许多意大利葡萄酒商开始尝试在巴贝拉葡萄酒中加入其它葡萄品种&#xff0c;其中两个最受欢迎的意大利品种是皮埃蒙特的巴贝拉德阿尔巴和达斯蒂。和朋友在一家意大利餐厅吃饭&#xff0c;被酒单吓到了&#xff1…

24. 常用shell之 du - 显示目录空间使用情况 的用法和衍生用法

du&#xff08;disk usage&#xff09;是 Unix 和类 Unix 系统&#xff08;如 Linux 和 macOS&#xff09;中的一个命令&#xff0c;用于显示文件和目录的磁盘空间使用情况。与 df 命令不同&#xff0c;du 更注重于单个文件和目录的空间使用&#xff0c;而不是整个文件系统的使…

10.1Linux输入子系统介绍

输入设备介绍 鼠标、键盘、按键、触摸屏等提供输入支持的设备都属于输入设备&#xff0c;在Linux也提供了一套驱动框架“input 子系统”与之对应&#xff0c;用于抽象输入设备&#xff0c;并提供管理输入设备驱动和输入事件处理程序的功能 input 子系统 input 子系统用于管理…

GPT 魔力涌现

GPT 二、Prompt 的典型构成 角色&#xff1a;给 AI 定义一个最匹配任务的角色&#xff0c;比如&#xff1a;「你是一位软件工程师」「你是一位小学老师」指示&#xff1a;对任务进行描述上下文&#xff1a;给出与任务相关的其它背景信息&#xff08;尤其在多轮交互中&#xff…

分布式文件存储系统minio了解下

什么是minio minio 是一个基于 Apache License v2.0 开源协议的对象存储服务。非常适合于存储大容量非结构化的数据&#xff0c;例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等&#xff0c;而一个对象文件可以是任意大小。 是一种海量、安全、低成本、高可靠的云存储…

机器学习笔记 - 用于自动化检测服饰的YOLOs-Fashionpedia模型

一、安装环境 使用预训练模型和 PyTorch Lightning 来自动化产品标记过程,将大幅度提高耗时的任务的效率。 # 安装软件包 pip install torch== 2.0 .0 pip install pytorch-lightning== 2.0 .1 pip install datasets== 2.11 .0 pip install Transformers== 4.30

Map.entry用法详解

Map.entry用法详解 大家好&#xff0c;我是免费搭建查券返利机器人赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;在Java编程的旅途中&#xff0c;Map.Entry是一位不可或缺的伙伴&#xff0c;为我们提供了在Map中…

Java: Random

/*** encoding: utf-8* 版权所有 2023 涂聚文有限公司* 许可信息查看&#xff1a;* 描述&#xff1a; //https://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/RandomStringUtils.html* //https://commons.apache.org/pro…

#HarmonyOS:UIAbility组件生命周期--UIAbility组件启动模式

UI界面的应用组件&#xff0c;主要用于和用户交互。 UIAbility组件生命周期 UIAbility的生命周期包括Create、 onWindowStageCreate、Foreground、Background、onWindowStageDestroy Destroy四个状态 UIAbility组件启动模式 singleton&#xff08;单实例模式&#xff09;…

详解RTC:以华人文化打造链上生态

文化是人类在发展的历史长河中淘洗出来的智慧结晶&#xff0c;随着人类社会的进步和变迁&#xff0c;经历了从口口相传到互联网等不同历史时代的传承和创新。在数字技术飞速发展的当今&#xff0c;区块链技术为文化的创新与传承提供了全新的空间和方式&#xff0c;使其得以在新…