线程池的核心参数有哪些?

简介: 线程池七大核心参数:核心/最大线程数、线程保持时间及单位、阻塞队列、线程工厂与拒绝策略。

1. corePoolSize -----------------核心线程数量

  • 作用:定义了线程池的基本大小。
  • 执行流程:当一个新任务提交到线程池时,如果当前运行的线程数小于 corePoolSize,线程池会立即创建一个新线程来执行该任务,即使池中还有其他空闲线程。

2. maximumPoolSize -----------最大线程数量

  • 作用:定义了线程池的上限。当任务量激增时,线程池可以创建的最大线程数不能超过此值。
  • 执行流程:当工作队列(workQueue)已满,并且当前运行的线程数小于 maximumPoolSize 时,线程池会创建新的非核心线程来处理任务。
  1. keepAliveTime ---------------线程保持时间,N个时间单位

作用:用于回收空闲的非核心线程,避免长时间占用系统资源。

  • 执行流程:如果一个非核心线程的空闲时间超过了 keepAliveTime,它就会被终止。当 allowCoreThreadTimeOut 设置为 true 时,这个参数也同样适用于核心线程。

4. unit ----------------------------时间单位(比如秒,分)

  • 作用:定义 keepAliveTime 的时间尺度。
  • 可选值TimeUnit 枚举类中的值,如 SECONDS(秒)、MILLISECONDS(毫秒)、MINUTES(分钟)等。

5. workQueue -------------------阻塞队列

  • 作用:作为任务的“缓冲区域”,是连接任务提交者和线程池执行者的桥梁。
  • 执行流程:当新任务提交时,如果当前运行线程数已达到 corePoolSize,任务会被放入 workQueue。队列的类型和容量对线程池的行为有重大影响。
  • 常用队列类型
  • ArrayBlockingQueue:基于数组的有界阻塞队列,必须指定容量,按 FIFO(先进先出)原则排序。
  • LinkedBlockingQueue:基于链表的阻塞队列,可以是有界的也可以是无界的(默认是 Integer.MAX_VALUE),按 FIFO 排序。使用无界队列时,maximumPoolSize 参数将失效,因为任务永远不会填满队列去触发创建非核心线程。
  • SynchronousQueue:一个不存储元素的阻塞队列。每个插入操作必须等待一个相应的移除操作,反之亦然。通常需要将 maximumPoolSize 设置得很大,以避免任务被拒绝。
  • PriorityBlockingQueue:具有优先级的无界阻塞队列。任务会根据其优先级进行排序执行。

6. threadFactory ----------------线程工厂

用于创建新线程的工厂。通过自定义线程工厂,我们可以对新创建的线程进行定制化处理。

  • 作用
  • 为线程设置一个有意义的名字,方便问题排查(如通过 jstack 查看线程堆栈)。
  • 设置线程的守护状态(setDaemon(true/false))。
  • 设置线程的优先级。
  • 默认实现Executors.defaultThreadFactory(),它会创建名称为 pool-N-thread-M 的非守护线程。

7. handler -----------------------线程池拒绝策略

  • 作用:定义了当线程池无法接受新任务时的处理方式。
  • 内置的拒绝策略
  • ThreadPoolExecutor.AbortPolicy(默认):直接抛出 RejectedExecutionException 异常,阻止系统正常工作。
  • ThreadPoolExecutor.CallerRunsPolicy:“调用者运行”策略。既不抛弃任务也不抛出异常,而是将任务回退给调用者(即提交任务的那个线程)来执行。可以有效减缓新任务的提交速度。
  • ThreadPoolExecutor.DiscardPolicy:直接悄悄地丢弃这个任务,不做任何处理和通知。
  • ThreadPoolExecutor.DiscardOldestPolicy:丢弃工作队列中最旧的那个任务(即队头的任务),然后尝试重新提交当前任务
目录
相关文章
|
监控 Java 数据库
深入探讨线程池及其关键参数
深入探讨线程池及其关键参数
|
Java 数据库连接 调度
面试题:用过线程池吗?如何自定义线程池?线程池的参数?
字节跳动面试题:用过线程池吗?如何自定义线程池?线程池的参数?
260 0
|
4月前
|
缓存 Java
线程池的核心参数
线程池七大参数解析:核心线程数决定常驻线程,最大线程数控制并发上限,存活时间管理非核心线程生命周期,工作队列缓存待处理任务,线程工厂定制线程属性,拒绝策略应对任务过载,提升系统稳定性与资源利用率。
329 1
|
Java
解析Java线程池:参数详解与执行流程
解析Java线程池:参数详解与执行流程
248 1
|
9月前
|
Java
线程池的核心参数有哪些 ?
corePoolSize 核心线程数量 maximumPoolSize 最大线程数量 keepAliveTime 线程保持时间,N个时间单位 unit 时间单位(比如秒,分) workQueue 阻塞队列 threadFactory 线程工厂 handler 线程池拒绝策略
|
缓存 安全 算法
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
Java面试题:如何通过JVM参数调整GC行为以优化应用性能?如何使用synchronized和volatile关键字解决并发问题?如何使用ConcurrentHashMap实现线程安全的缓存?
188 0
线程池七大参数
核心线程数:线程池中的基本线程数量 最大线程数:当阻塞队列满了之后,逐一启动 最大线程的存活时间:当阻塞队列的任务执行完后,最大线长的回收时间 最大线程的存活时间单位 阻塞队列:当核心线程满后,后面来的任务都进入阻塞队列 线程工厂:用于生产线程
|
缓存 Java
异步&线程池 线程池的七大参数 初始化线程的4种方式 【上篇】
这篇文章详细介绍了Java中线程的四种初始化方式,包括继承Thread类、实现Runnable接口、实现Callable接口与FutureTask结合使用,以及使用线程池。同时,还深入探讨了线程池的七大参数及其作用,解释了线程池的运行流程,并列举了四种常见的线程池类型。最后,阐述了在开发中使用线程池的原因,如降低资源消耗、提高响应速度和增强线程的可管理性。
异步&线程池 线程池的七大参数 初始化线程的4种方式 【上篇】
|
消息中间件 Java 大数据
"深入理解Kafka单线程Consumer:核心参数配置、Java实现与实战指南"
【8月更文挑战第10天】在大数据领域,Apache Kafka以高吞吐和可扩展性成为主流数据流处理平台。Kafka的单线程Consumer因其实现简单且易于管理而在多种场景中受到欢迎。本文解析单线程Consumer的工作机制,强调其在错误处理和状态管理方面的优势,并通过详细参数说明及示例代码展示如何有效地使用KafkaConsumer类。了解这些内容将帮助开发者优化实时数据处理系统的性能与可靠性。
379 7
|
设计模式 Java 物联网
【多线程-从零开始-玖】内核态,用户态,线程池的参数、使用方法详解
【多线程-从零开始-玖】内核态,用户态,线程池的参数、使用方法详解
291 0