线程池的七大核心参数以及常用的四种线程池详解

 更新时间:2025年05月07日 09:59:28   作者:机智小袁  
这篇文章主要介绍了线程池的七大核心参数以及常用的四种线程池使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

引言

我们通过线程池可以实现已创建线程的复用,减少资源的消耗;控制并发的数量;以及对线程进行统一的管理。

下面我会对线程池的核心参数以及常用的线程池种类进行详细的讲解。

7大核心参数

int corePoolSize 核心线程最大数量

核心线程:

  • 线程池中有两类线程:核心线程和非核心线程。
  • 核心线程默认情况下会一直存在于线程池中,即使这个核心线程什么都不干,而非核心线程如果长时间的闲置,就会被销毁。

int maximumPoolSize 线程总数量最大值

改值等于核心线程数+非核心线程数

long keepAliveTime 非核心线程的闲置超时时间

非核心线程闲置时间超过此值就会被销毁

TimeUnit unit (keepAliveTime的单位)

TimeUnit是一个枚举类型:

  • NANOSECONDS : 1微毫秒,
  • MICROSECONDS:1微秒
  • MILLSECONDS:1毫秒
  • SECONDS:1秒
  • MINUTES:1分
  • HOURS:1小时
  • DAYS:1天

BlockingQueue workQueue 阻塞队列

常见的几个阻塞队列:

  • LinkedBlockingQueue

链式阻塞队列,默认大小:Interger.MAX_VALUE,可以指定大小。

  • ArrayBlockingQueue

数组阻塞队列,需要指定大小

  • SynchronousQueue

同步队列,内部容量为0,每个put操作都必须等待一个take操作。反之亦然

  • DelayQueue

延迟队列,队列中的元素之后当其指定的延迟时间到了,才能从队列中获取到改元素。

ThreadFactory threadFactory 线程工厂

创建线程的工厂,用于批量创建线程,如果不指定,会新建一个默认的线程工厂。

RejectedExecutionHandler handler 拒绝策略

拒绝处理策略,当无法创建新线程处理任务并且阻塞队列已满时就会采用拒绝处理策略。

jdk默认四种策略:

  • ThreadPoolExecutor.AbortPolicy:默认拒绝处理策略,丢弃任务并抛出异常
  • ThreadPollExecutor.DiscardPolicy:丢弃新来的任务,但不抛出异常
  • ThreadPollExecutor.DiscardOldestPolicy:丢弃阻塞队列头部(最旧)的任务,然后重新尝试执行程序,(如果再次失败,重复此过程)
  • ThreadPollExecutor.CallerRunPolicy:由调用的线程去处理改任务。只适用于并发小的情况。

常用的四种线程池

newCachedThreadPool (可缓存线程池)

核心线程数为0,总线程数是最大整数,当需要执行很多短时任务时它的服用率比较高,会显著提升性能。并且线程空闲60s就会被回收,所以如果没有任务,它并不会占用很多资源。

newFixedThreadPool(指定工作线程数量的线程池)

核心线程数等于最大线程数。也就是该线程池中没有非核心线程。

newSingleThreadPool(单线程化的线程池)

只有一个核心线程,所有任务按照先来先执行的顺序执行。

newScheduledThreadPool(定长线程池)

这个线程池指定了核心线程的数量,线程总数可以创建整数的最大数个。

该线程池支持定时以及周期性任务执行。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 浅谈Java程序运行机制及错误分析

    浅谈Java程序运行机制及错误分析

    这篇文章主要主要介绍了Java虚拟机(JVM)的有关内容以及Java程序的运行机制和错误分析,需要的朋友可以了解下。
    2017-09-09
  • JAVA IO和NIO的主要区别及使用说明

    JAVA IO和NIO的主要区别及使用说明

    Java IO(BIO)阻塞式,逐字节流处理;NIO非阻塞,基于缓冲区和通道实现多路复用,单线程管理多连接,适合高并发网络编程,IO代码简单但性能低,NIO性能高但复杂度增加,选择需权衡开发效率与性能需求
    2025-09-09
  • Java中队列Queue和Deque的区别与代码实例

    Java中队列Queue和Deque的区别与代码实例

    学过数据结构的,一定对队列不陌生,java也实现了队列,下面这篇文章主要给大家介绍了关于Java中队列Queue和Deque区别的相关资料,需要的朋友可以参考下
    2021-08-08
  • idea导入配置Spring Boot项目的详细步骤教程

    idea导入配置Spring Boot项目的详细步骤教程

    这篇文章主要给大家介绍了关于idea导入配置Spring Boot项目的详细步骤,在项目开发过程中,无论是导入运行团队开发的项目,还是一些开源项目,还是其他的项目,想要在IDEA中完整的运行起来总有很多坑,需要的朋友可以参考下
    2023-08-08
  • SpringMVC中如何获取@PathVariable的值

    SpringMVC中如何获取@PathVariable的值

    这篇文章主要介绍了SpringMVC中如何获取@PathVariable的值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • 从零搭建脚手架之集成Spring Retry实现失败重试和熔断器模式(实战教程)

    从零搭建脚手架之集成Spring Retry实现失败重试和熔断器模式(实战教程)

    在我们的大多数项目中,会有一些场景需要重试操作,而不是立即失败,让系统更加健壮且不易发生故障,这篇文章主要介绍了从零搭建开发脚手架之集成Spring Retry实现失败重试和熔断器模式,需要的朋友可以参考下
    2022-07-07
  • 微服务 Spring Boot 整合 Redis BitMap 实现 签到与统计功能

    微服务 Spring Boot 整合 Redis BitMap 实现 签到与统计功能

    这篇文章主要介绍了微服务 Spring Boot 整合 Redis BitMap 实现 签到与统计功能,文章简单介绍了Redis BitMap 基本用法结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-01-01
  • Java项目日志脱敏解决方案

    Java项目日志脱敏解决方案

    为了保护客户的敏感信息,我们提出了四种日志脱敏处理方案,需要根据实际项目需求和情况进行选择,新项目或重构的项目,对于项目标准化要求较高的,推荐使用方案四,感兴趣的朋友参考下本文
    2024-10-10
  • Java数据结构之单链表详解

    Java数据结构之单链表详解

    在之前的学习中,我们主要了解了很多 Java 的 基本语法,但是在之后的 Java学习中,了解基础数据结构的知识非常重要,数据结构的思想可以帮助我们更加清晰明白的了解 Java 的解题思路等等.今天我们就来开始学习实现一个Java基础的单链表,需要的朋友可以参考下
    2021-05-05
  • 使用Spring事物时不生效的场景及解决方法

    使用Spring事物时不生效的场景及解决方法

    今天介绍一下Spring事物不生效的场景,事物是我们在项目中经常使用的,如果是Java的话,基本上都使用Spring的事物,不过Spring的事物如果使用不当,那么就会导致事物失效或者不回滚,最终导致数据不一致,下面我们意义列举不生效的场景,并给出解决方法
    2023-09-09

最新评论