Java线程池七个参数详解

前言

直接点题

核心线程数 - corePoolSize

最大线程数 - maximumPoolSize

空闲线程存活时间 - keepAliveTime

存活时间单位 - unit

任务队列 - workQueue

线程工厂 - threadFactory

拒绝策略- handler

概念

什么是池?

池(Pool),可以把它理解为一个容器,里面装着各种我们所需要的资源,我们需要资源的时候去这个容器里面拿,而不需要每次使用的时候去创建,从而达到一个复用的效果提高资源可利用率。

线程池的概念

线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务。简单点理解就是在需要使用多线程执行任务的时候不需要进行线程的创建,而是把任务提交到线程池中由线程池按照一定的规则处理。

详解

1 corePoolSize(核心线程数)

corePoolSize表示核心线程数,核心线程数是指线程池中始终保持着活动的线程数量,可以这么理解,就算线程池中没有任务执行,线程为空闲状态也不会被回收。

但是也有可以被回收的情况,例如我们设置线程池中 allowCoreThreadTimeOut 为 true 那么核心线程数也会因为超过一定的阈值而被回收,设置 allowCoreThreadTimeOut 的案例如下
 

public class PoolTest {public static void main(String[] args) {// 创建一个阻塞队列,用于存放等待执行的任务BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>(10);// 创建自定义的线程池,设置核心线程数、最大线程数、等待时间、时间单位、任务队列等参数ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 1, TimeUnit.MINUTES, queue);// 提交任务给线程池,使用 execute() 方法提交for (int i = 0; i < 10; i++) {Runnable task = new MyTask(i);executor.execute(task);}// 设置为 true 那么一些空闲的核心线程可能会在超过一分钟之后被回收掉executor.allowCoreThreadTimeOut(true);// 关闭线程池executor.shutdown();}}
class MyTask implements Runnable {private final int taskId;public MyTask(int taskId) {this.taskId = taskId;}@SneakyThrows@Overridepublic void run() {Thread.sleep(2000);System.out.println("Task ID : " + taskId + " 执行 " + Thread.currentThread().getName());}
}

2 maximumPoolSize(最大线程数)

线程池中允许的最大线程数量,包括核心线程和额外创建的临时线程数量。

在向线程池中提交任务的时,假如当前的任务数量超过了corePoolSize(核心线程数),同时workQueue(任务队列)也满了,那么就会根据需要来创建corePoolSize(核心线程数)之外的临时线程数,但 corePoolSize(核心线程数)和 临时线程数总数不能超过maximumPoolSize(最大线程数)。

3 keepAliveTime(空闲的线程存活时间)

它表示当线程处于空闲状态的时候或没有任务执行时,线程可额外存活的时间,如果这段额外的时间没有需要处理的任务,那么超过这个时间空闲的线程就会被终止并从线程池中移除。例如上面的例子,设置的是1分钟超时时间(可以自己设置),空闲时间超过一分钟线程就会被回收掉。
 

4 unit(时间单位)

是用于表示线程池中时间单位的枚举类型,提供了一个枚举类 java.util.concurrent.TimeUnit 可以配置枚举类中任意一种例如 TimeUnit.SECONDS 秒,TimeUnit.MINUTES 分钟,TimeUnit.HOURS 小时,TimeUnit.DAYS 天 等,配合 keepAliveTime(空闲的线程存活时间)进行使用。

5 workQueue(任务队列)

用于存储线程池中待执行任务的阻塞队列,通常下线程池中任务数量超过了 corePoolSize(核心线程数)时,那么新提交的任务就会被放至 workQueue(任务队列)当中,例如上面案例设置的任务队列大小为10,核心线程数为 5,当线程池正在执行的任务超过5的时候就会把新提交的任务暂放至任务队列当中,任务队列当中等待的任务最多为10个。

线程池的工作队列当中可以是不同的阻塞队列,案例中使用的是 LinkedBlockingQueue,常用的阻塞队列有:

  •     LinkedBlockingQueue:一个基于链表结构的可选有界阻塞队列,按照先进先出的顺序进行任务调度。如果不指定容量大小,则默认为 Integer.MAX_VALUE。
  •     PriorityBlockingQueue:一个基于优先级的无界阻塞队列,可以按照自定义的顺序执行任务。
  •     SynchronousQueue:一个不存储元素的阻塞队列,每个插入操作必须等待另一个线程的移除操作。在这种队列中,每个插入操作都会阻塞,直到有其他线程来获取数据。
  •     ArrayBlockingQueue:一个基于数组结构的有界阻塞队列,按照先进先出(FIFO)的顺序进行任务调度。
     

6 handler(拒绝策略)

用来处理线程池中的workQueue(任务队列)已满、并且线程池中的线程数已达到maximumPoolSize(最大线程数)时的情况,线程池会根据定义的拒绝策略来处理这些任务。

内置的拒绝策略有以下几种:

  •     AbortPolicy:直接抛出 RejectedExecutionException 异常,表示无法接受新任务,没有配置拒绝策略,默认为该策略。
  •     CallerRunsPolicy:将任务回退到调用者所在线程中执行,也就是由调用 execute 方法的线程来执行该任务。
  •     CallerRunsPolicy:将任务回退到调用者所在线程中执行,也就是由调用 execute 方法的线程来执行该任务。
  •     DiscardPolicy:直接丢弃无法处理的任务,不做任何处理。
  •     DiscardOldestPolicy:丢弃添加到工作队列最早的任务,并尝试重新提交当前任务。

7 threadFactory(创建线程工厂)

用来创建线程工厂的类,在线程池中需要创建新线程时使用 threadFactory(创建线程工厂) 进行创建线程对象,可以通过自定义 threadFactory(创建线程工厂)对线程进行个性化配置和定制,例如设置线程的名称、优先级等,可以更好的跟踪和管理线程池中的线程,例如以下案例给线程池中线程进行命名。
 

public class PoolTest {public static void main(String[] args) {int corePoolSize = 5;int maximumPoolSize = 10;long keepAliveTime = 1;TimeUnit unit = TimeUnit.MINUTES;BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>();ThreadFactory threadFactory = new MyThreadFactory(); // 自定义的ThreadFactoryThreadPoolExecutor executor = new ThreadPoolExecutor(corePoolSize,maximumPoolSize,keepAliveTime,unit,workQueue,threadFactory);// csdn 骑电动车的小黄for (int i = 0; i < 10; i++) {// 提交任务到线程池executor.execute(new Runnable() {@Overridepublic void run() {// 任务逻辑代码System.out.println("开始执行任务 线程的自定义名称为:" + Thread.currentThread().getName());}});}// 关闭线程池...executor.shutdown();}}
class MyThreadFactory implements ThreadFactory {private static final String THREAD_NAME_PREFIX = "这是一个线程自定义名称-";private int counter = 1;@Overridepublic Thread newThread(Runnable r) {Thread thread = new Thread(r);thread.setName(THREAD_NAME_PREFIX + counter);thread.setPriority(Thread.NORM_PRIORITY);thread.setDaemon(false);counter++;return thread;}
}

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

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

相关文章

haiku实现门控多头注意力模块

在多头注意力机制中&#xff0c;通常输入的数据包括查询&#xff08;Q&#xff09;、键&#xff08;K&#xff09;和值&#xff08;V&#xff09;。这些数据的维度以及权重矩阵的维度在多头注意力机制中扮演关键角色。下面对数据及权重的维度进行解释&#xff1a; 输入数据&…

鸿蒙原生应用/元服务开发-长时任务

概述 功能介绍 应用退至后台后&#xff0c;对于在后台需要长时间运行用户可感知的任务&#xff0c;例如播放音乐、导航等。为防止应用进程被挂起&#xff0c;导致对应功能异常&#xff0c;可以申请长时任务&#xff0c;使应用在后台长时间运行。申请长时任务后&#xff0c;系统…

Linux调试------gdb的使用

目录 前言 一、gdb打开可执行程序 二、查看代码与操作断点 1.l 查看代码 2.b 打断点 3.info b 查看断点信息 4.d 删除断点 5.disable 和 enable 断点的禁用与启用 三、调试 1.r 启动调试 2. n 逐过程 3. s 逐语句 4.display显示变量 5.undisplay 取消显…

e2studio开发磁力计LIS2MDL(1)----轮询获取磁力计数据

e2studio开发磁力计LIS2MDL.1--轮询获取磁力计数据 概述视频教学样品申请源码下载速率新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user_uart_callback ()prin…

C语言菱形图案生成程序详细解析

1. 介绍 在这篇博客中&#xff0c;我们将详细解析一个用C语言编写的程序&#xff0c;该程序旨在生成具有对称美感的菱形图案。用户可以通过输入指定的长度&#xff0c;程序将输出相应大小的菱形。 2. 代码 注&#xff1a;代码中的注释已经非常详细&#xff0c;也有举例&#…

根据MySql的表名,自动生成实体类,模仿ORM框架

ORM框架可以根据数据库的表自动生成实体类&#xff0c;以及相应CRUD操作 本文是一个自动生成实体类的工具&#xff0c;用于生成Mysql表对应的实体类。 新建Winform窗体应用程序AutoGenerateForm&#xff0c;框架(.net framework 4.5)&#xff0c; 添加对System.Configuration的…

高效构建Java应用:Maven入门和进阶(三)

高效构建Java应用&#xff1a;Maven入门和进阶&#xff08;三&#xff09; 三. Maven的核心功能和构建管理3.1 依赖管理和配置3.2 依赖传递和冲突3.3 依赖导入失败场景和解决方案3.4 扩展构建管理和插件配置 三. Maven的核心功能和构建管理 3.1 依赖管理和配置 Maven 依赖管理…

7-Docker私有仓库registry搭建

1.Docker私有仓库registry搭建 1.下载registry镜像 命令: docker pull registry [root@centos79 ~]# docker search registry NAME DESCRIPTION STARS OFFICIAL AUTOMATED registry …

CentOS安装Docker(超详细)

CentOS安装Docker 1 知识小课堂2 CentOS安装Docker2.1 1.1.卸载&#xff08;可选&#xff09;1.2.安装docker1.3.启动docker1.4.配置镜像加速 3 CentOS安装DockerCompose3.1.下载3.2.修改文件权限3.3.Base自动补全命令&#xff1a; 4 Docker镜像仓库4.1.简化版镜像仓库4.2.带有…

数据分析求职-知识脑图

今天和大家聊聊数据分析求职常见面试题&#xff0c;这是这个系列的第一篇文章&#xff0c;但是我不想开始就直接罗列题目&#xff0c;因为这样的文章实在太多了&#xff0c;同学们的兴趣程度肯定一般。所以&#xff0c;我想先和大家聊聊在准备面试题时候通常遇到的困扰&#xf…

GFP-CERTIFIED®FLUOFORTE®钙离子检测试剂盒

Enzo Life Sciences的GFP-CERTIFIED FLUOFORTE Calcium assay kit提供了一种荧光分析方法&#xff0c;用于检测广泛生物靶标的细胞内钙动员情况。相对于其他商业化的染料&#xff0c;GFP-CERTIFIED FLUOFORTE染料是最亮和最灵敏的荧光钙指示剂。该试剂盒为贴壁和非贴壁细胞系提…

生物信息学中的可重复性研究

科学就其本质而言&#xff0c;是累积渐进的。无论你是使用基于网络的还是基于命令行的工具&#xff0c;在进行研究时都应保证该研究可被其他研究人员重复。这有利于你的工作的累积与进展。在生物信息学领域&#xff0c;这意味着如下内容。 工作流应该有据可查。这可能包括在电脑…

linux 压力测试 AB ApacheBench

ab的简介 ab是apachebench命令的缩写。 ab是apache自带的压力测试工具。ab非常实用&#xff0c;它不仅可以对apache服务器进行网站访问压力测试&#xff0c;也可以对或其它类型的服务器进行压力测试。比如nginx、tomcat、IIS等 ab的原理 ab的原理&#xff1a;ab命令会创建多…

Pendulum详解3——Pendulum在数据分析中的应用 - 时光的数据探险

写在开头: 在数据分析的世界里,时光是一项无可避免的数据元素。处理时间数据,尤其是在大规模数据集和复杂时区的情境下,是数据科学家和分析师们经常面对的挑战。为了迎接这一挑战,我们介绍一款强大的时间处理库 - Pendulum,并深入探讨其在数据分析领域的优越性。 1. 时…

ros架构

ROS&#xff08;Robot Operating System&#xff09;是一个灵活的、分布式的系统架构&#xff0c;用于构建机器人软件。它由一系列工具、库和约定组成&#xff0c;提供了一套通用的功能和通信机制&#xff0c;以支持机器人系统的开发、部署和运行。 ROS架构主要包括以下几个核心…

C++面试宝典第17题:找规律填数

题目 仔细观察下面的数字序列,找到规律,并填写空白处的数字。 (1)1, 2, 4, 7, 11, 16, __ (2)-1, 2, 7, 28, __, 126 (3)6, 10, 18, 32, 57, __ (4)19, 6, 1, 2, 11, __ (5)2, 3, 5, 7, 11, __ (6)1, 8, 9, 4, __, 1/6 (7)1, 2, 3, 7, 16, __, 321 (8)1, 2, …

linux异常情况,排查处理中

登录客户环境后&#xff0c;发现一个奇怪情况如下图&#xff0c;之前也遇到过&#xff0c;直接fuser -ck /backup操作的话&#xff0c;主机将会重启&#xff0c;因数据库运行中&#xff0c;等待停机维护时间&#xff0c;同时也在想办法不重启的情况下解决该问题 [rootdb ~]# f…

linux发送http请求命令

一、http get请求 1、curl命令不带参 curl “http://www.baidu.com” 如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地 curl -i “http://www.baidu.com” 显示全部信息 curl -l “http://www.baidu.com” 只显示头部信息 curl -v “http://www.baidu.com”…

git撤销提交到本地的commit

有些时候&#xff0c;当我们提交代码到本地后&#xff0c;突然发现因为某些原因需要撤销提交本地的代码。 就比如我&#xff0c;因为代码写错了分支&#xff0c;已经提交到本地了&#xff0c;而我需要取消&#xff0c;并且还要把代码搞得另外的分支上。 提交前&#xff1a; …

SpiderFlow爬虫平台 前台RCE漏洞复现(CVE-2024-0195)

0x01 产品简介 SpiderFlow是新一代爬虫平台,以图形化方式定义爬虫流程,以流程图的方式定义爬虫,不写代码即可完成爬虫,是一个高度灵活可配置的爬虫平台。 0x02 漏洞概述 SpiderFlow爬虫平台src/main/java/org/spiderflow/controller/FunctionController.java文件的Functi…