Java线程池ThreadPoolExcutor源码解读详解01-参数说明

本文涉及的产品
应用实时监控服务-用户体验监控,每月100OCU免费额度
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
可观测可视化 Grafana 版,10个用户账号 1个月
简介: `ThreadPoolExecutor`是Java中用于创建线程池的类,其构造函数包含核心线程数`corePoolSize`、最大线程数`maximumPoolSize`、空闲线程存活时间`keepAliveTime`、时间单位`unit`、工作队列`workQueue`、线程工厂`threadFactory`和拒绝策略`handler`等参数。`corePoolSize`是始终保持的线程数,除非设置`allowCoreThreadTimeOut`。当线程数超过核心线程数时,新任务会放入工作队列,直到队列满且线程数未达到`maximumPoolSize`,才会创建新线程处理。

一、ThreadPoolExcutor创建线程池构造器:

 

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {
        ...
    }

image.gif

二、参数说明

2.1 corePoolSize

原注释: corePoolSize the number of threads to keep in the pool, even if they are idle, unless {@code allowCoreThreadTimeOut} is set

image.gif

1. 在线程池中保留的线程数,即使它们是空闲的,除非设计了allowCoreThreadTimeOut。
    当设置了allowCoreThreadTimeOut为true时(默认是false),线程池中corePoolSize线程空闲时间达到keepAliveTime时将关闭
2. 当线程数<corePoolSize时,即使此时线程池中存在空闲线程,新提交任务将创建一个新线程执行任务。
3. 当线程数>=corePoolSize时,则新任务放入workQueue中。
4. 当workQueue已满,且maximumPoolSize > corePoolSize时,创建新线程执行新任务
5. 当提交任务数=maximumPoolSize时,新任务将被拒绝,并由RejectedExecutionHandler处理
6. 当线程池中超过corePoolSize线程,空闲时间达到keepAliveTime时关闭

image.gif

2.2 maximumPoolSize

原注释:the maximum number of threads to allow in the pool.
线程池中允许创建的最大线程数

image.gif

2.3 keepAliveTime

原注释:when the number of threads is greater than the core, this is the maximum time that excess idle threads will wait for new tasks before terminating.
当线程数大于核心时,这是多余空闲线程在终止前等待新任务的最大时间。
如果将参数allowcorethreadtimeout=true,则这个线程的最大生命周期设置的超时时间也会作用于核心线程

image.gif

2.4 unit

原注释:the time unit for the {@code keepAliveTime} argument
keepAliveTime的时间单位,是一个枚举类型
    NANOSECONDS : 1微毫秒 = 1微秒 / 1000
    MICROSECONDS : 1微秒 = 1毫秒 / 1000
    MILLISECONDS : 1毫秒 = 1秒 /1000
    SECONDS : 秒
    MINUTES : 分
    HOURS : 小时
    DAYS : 天

image.gif

2.5 workQueue

原注释: the queue to use for holding tasks before they are executed.  This queue will hold only the {@code Runnable} tasks submitted by the {@code execute} method.
线程阻塞队列,当核心线程均在工作时,新任务将放进阻塞队列中。

image.gif

2.6 threadFactory

原注释: the factory to use when the executor creates a new thread
线程池创建新线程的工厂

image.gif

2.7 handler

原注释: the handler to use when execution is blocked because the thread bounds and queue capacities are reached
拒绝任务处理器(拒绝策略),四种策略:
    AbortPolicy: 默认策略,不执行此任务,而是直接抛出一个运行时异常
    CallerRunsPolicy: 任务被拒绝添加后,会再次调用execute(submit)来执行被拒绝的任务
    DiscardOldestPolicy: workQueue中抛弃head的一个任务,再次execute此任务
    DiscardPolicy: 直接抛弃,任务不执行

image.gif


相关文章
|
7天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
22 2
|
12天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
24天前
|
监控 安全 Java
在 Java 中使用线程池监控以及动态调整线程池时需要注意什么?
【10月更文挑战第22天】在进行线程池的监控和动态调整时,要综合考虑多方面的因素,谨慎操作,以确保线程池能够高效、稳定地运行,满足业务的需求。
102 38
|
11天前
|
人工智能 监控 数据可视化
Java智慧工地信息管理平台源码 智慧工地信息化解决方案SaaS源码 支持二次开发
智慧工地系统是依托物联网、互联网、AI、可视化建立的大数据管理平台,是一种全新的管理模式,能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。围绕施工现场管理的人、机、料、法、环五大维度,以及施工过程管理的进度、质量、安全三大体系为基础应用,实现全面高效的工程管理需求,满足工地多角色、多视角的有效监管,实现工程建设管理的降本增效,为监管平台提供数据支撑。
27 3
|
16天前
|
运维 自然语言处理 供应链
Java云HIS医院管理系统源码 病案管理、医保业务、门诊、住院、电子病历编辑器
通过门诊的申请,或者直接住院登记,通过”护士工作站“分配患者,完成后,进入医生患者列表,医生对应开具”长期医嘱“和”临时医嘱“,并在电子病历中,记录病情。病人出院时,停止长期医嘱,开具出院医嘱。进入出院审核,审核医嘱与住院通过后,病人结清缴费,完成出院。
50 3
|
24天前
|
Prometheus 监控 Cloud Native
JAVA线程池监控以及动态调整线程池
【10月更文挑战第22天】在 Java 中,线程池的监控和动态调整是非常重要的,它可以帮助我们更好地管理系统资源,提高应用的性能和稳定性。
63 4
|
22天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
24天前
|
Prometheus 监控 Cloud Native
在 Java 中,如何使用线程池监控以及动态调整线程池?
【10月更文挑战第22天】线程池的监控和动态调整是一项重要的任务,需要我们结合具体的应用场景和需求,选择合适的方法和策略,以确保线程池始终处于最优状态,提高系统的性能和稳定性。
96 2
|
25天前
|
移动开发 前端开发 JavaScript
java家政系统成品源码的关键特点和技术应用
家政系统成品源码是已开发完成的家政服务管理软件,支持用户注册、登录、管理个人资料,家政人员信息管理,服务项目分类,订单与预约管理,支付集成,评价与反馈,地图定位等功能。适用于各种规模的家政服务公司,采用uniapp、SpringBoot、MySQL等技术栈,确保高效管理和优质用户体验。
|
26天前
|
缓存 监控 Java
java中线程池的使用
java中线程池的使用