Java线程池七个参数详解

本文深入解析Java线程池的七大核心参数:corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory及handler。涵盖线程池的工作原理、不同队列类型与拒绝策略,为高效并发编程提供指导。
该文章已生成可运行项目,

java多线程开发时,常常用到线程池技术,这篇文章是对创建java线程池时的七个参数的详细解释。

从源码中可以看出,线程池的构造函数有7个参数,分别是corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler。下面会对这7个参数一一解释。

一、corePoolSize 线程池核心线程大小

线程池中会维护一个最小的线程数量,即使这些线程处理空闲状态,他们也不会被销毁,除非设置了allowCoreThreadTimeOut。这里的最小线程数量即是corePoolSize。任务提交到线程池后,首先会检查当前线程数是否达到了corePoolSize,如果没有达到的话,则会创建一个新线程来处理这个任务。

二、maximumPoolSize 线程池最大线程数量

当前线程数达到corePoolSize后,如果继续有任务被提交到线程池,会将任务缓存到工作队列(后面会介绍)中。如果队列也已满,则会去创建一个新线程来出来这个处理。线程池不会无限制的去创建新线程,它会有一个最大线程数量的限制,这个数量即由maximunPoolSize指定。

三、keepAliveTime 空闲线程存活时间

一个线程如果处于空闲状态,并且当前的线程数量大于corePoolSize,那么在指定时间后,这个空闲线程会被销毁,这里的指定时间由keepAliveTime来设定

四、unit 空闲线程存活时间单位

keepAliveTime的计量单位

五、workQueue 工作队列

新任务被提交后,会先进入到此工作队列中,任务调度时再从队列中取出任务。jdk中提供了四种工作队列:

①ArrayBlockingQueue

基于数组的有界阻塞队列,按FIFO排序。新任务进来后,会放到该队列的队尾,有界的数组可以防止资源耗尽问题。当线程池中线程数量达到corePoolSize后,再有新任务进来,则会将任务放入该队列的队尾,等待被调度。如果队列已经是满的,则创建一个新线程,如果线程数量已经达到maxPoolSize,则会执行拒绝策略。

②LinkedBlockingQueue

基于链表的无界阻塞队列(其实最大容量为Interger.MAX),按照FIFO排序。由于该队列的近似无界性,当线程池中线程数量达到corePoolSize后,再有新任务进来,会一直存入该队列,而基本不会去创建新线程直到maxPoolSize(很难达到Interger.MAX这个数),因此使用该工作队列时,参数maxPoolSize其实是不起作用的。

③SynchronousQueue

一个不缓存任务的阻塞队列,生产者放入一个任务必须等到消费者取出这个任务。也就是说新任务进来时,不会缓存,而是直接被调度执行该任务,如果没有可用线程,则创建新线程,如果线程数量达到maxPoolSize,则执行拒绝策略。

④PriorityBlockingQueue

具有优先级的无界阻塞队列,优先级通过参数Comparator实现。

六、threadFactory 线程工厂

创建一个新线程时使用的工厂,可以用来设定线程名、是否为daemon线程等等

七、handler 拒绝策略

当工作队列中的任务已到达最大限制,并且线程池中的线程数量也达到最大限制,这时如果有新任务提交进来,该如何处理呢。这里的拒绝策略,就是解决这个问题的,jdk中提供了4中拒绝策略:

①CallerRunsPolicy

该策略下,在调用者线程中直接执行被拒绝任务的run方法,除非线程池已经shutdown,则直接抛弃任务。

②AbortPolicy

该策略下,直接丢弃任务,并抛出RejectedExecutionException异常。

③DiscardPolicy

该策略下,直接丢弃任务,什么都不做。

④DiscardOldestPolicy

该策略下,抛弃进入队列最早的那个任务,然后尝试把这次拒绝的任务放入队列

到此,构造线程池时的七个参数,就全部介绍完毕了。

个人独立博客:JAVA线程池七个参数详解 - IT小跟班的技术博客

本文章已经生成可运行项目
<think>好的,用户想了解Java线程池参数配置,特别是ThreadPoolExecutor的核心线程数、最大线程数、保持存活时间等参数。首先,我需要回忆一下线程池的基本概念和各个参数的作用。根据引用内容,ThreadPoolExecutor有七个参数,分别是核心线程数、最大线程数、空闲线程存活时间、时间单位、工作队列、线程工厂和拒绝策略。用户提到的三个参数是前三个,可能需要详细解释每个参数的含义以及如何配置。 首先,核心线程数(corePoolSize)是线程池中保持活动状态的最小线程数,即使它们处于空闲状态。这部分线程不会被回收,除非设置了allowCoreThreadTimeOut为true。这个参数的设置需要根据任务类型来定,比如CPU密集型任务可能需要较少的核心线程,而IO密集型可能需要更多。 接下来是最大线程数(maximumPoolSize)。当工作队列满了之后,线程池会创建新线程,直到达到这个最大值。这个参数需要和核心线程数以及队列容量一起考虑。如果设置得太大,可能会导致资源耗尽;太小则无法处理突发的高负载。 然后是保持存活时间(keepAliveTime)。当线程数超过核心线程数时,空闲线程在等待新任务时的最长时间,超过这个时间就会被终止。这样可以避免资源浪费。需要注意,这个参数只有在线程数超过corePoolSize时才生效,而且如果allowCoreThreadTimeOut被启用,核心线程也会受此影响。 时间单位(unit)是keepAliveTime的时间单位,比如秒、分钟等,这个相对简单。 工作队列(workQueue)用于存放待处理的任务,不同的队列类型有不同的行为。比如使用无界队列可能会导致任务堆积,最终内存溢出,而有界队列可以防止资源耗尽,但需要合理设置队列大小。 线程工厂(threadFactory)用来创建新线程,可以自定义线程的名称、优先级等,有助于调试和监控。 拒绝策略(handler)当线程池和队列都满了之后,如何处理新提交的任务。常见的策略有直接抛出异常、丢弃任务、丢弃队列中最旧的任务,或者由调用者线程执行任务。 用户的问题主要集中在参数配置上,可能需要给出配置示例和注意事项。例如,如何根据任务类型调整核心线程数和最大线程数,如何选择合适的工作队列,以及如何设置合理的存活时间以避免资源浪费。同时,需要结合引用中的例子,比如示例代码中的参数设置,解释每个参数的作用。 另外,用户可能关心实际应用中如何避免常见错误,比如线程池的僵死问题,或者任务堆积导致的内存溢出。这时候需要强调参数之间的协调,比如核心线程数、最大线程数和队列大小的合理搭配。 最后,用户可能需要了解如何监控和调优线程池,比如通过线程池提供的统计信息来调整参数,或者使用动态配置的方式根据负载变化调整参数。不过这可能超出了当前问题的范围,但可以作为相关问题的延伸。</think>### Java线程池ThreadPoolExecutor参数详解 #### 一、核心参数配置说明 1. **核心线程数(corePoolSize)** - 线程池中保持活动状态的线程最小值,即使空闲也不会被销毁 - 默认情况下核心线程会一直存活(除非设置`allowCoreThreadTimeOut=true`) - 示例配置:`new ThreadPoolExecutor(5,...)`表示始终保持5个核心线程[^3] 2. **最大线程数(maximumPoolSize)** - 线程池允许创建的最大线程数量 - 当工作队列满时才会创建超出核心线程数的线程 - 与核心线程数的关系:最大线程数 ≥ 核心线程数[^3] 3. **保持存活时间(keepAliveTime)** - 非核心线程的空闲存活时间(单位由第4个参数指定) - 仅当线程数 > 核心线程数时生效 - 示例:`1, TimeUnit.MINUTES`表示空闲线程超过1分钟将被回收[^1] #### 二、完整参数结构 ```java ThreadPoolExecutor( int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler ) ``` #### 三、参数联动机制 1. **任务处理流程** - 新任务到来时优先使用核心线程 - 核心线程满时进入工作队列 - 队列满时创建新线程(直到达到最大线程数) - 所有线程满且队列满时触发拒绝策略[^3] 2. **典型配置示例** ```java new ThreadPoolExecutor( 5, // 核心线程数(常规负载) 10, // 最大线程数(突发流量) 1L, TimeUnit.MINUTES, // 超时回收非核心线程 new LinkedBlockingQueue<>(100), // 控制队列容量 Executors.defaultThreadFactory(), new ThreadPoolExecutor.AbortPolicy() // 拒绝策略 ) ``` #### 四、配置注意事项 1. **CPU密集型任务** - 建议核心线程数 = CPU核心数 - 最大线程数 ≤ CPU核心数 * 2 - 使用有界队列防止内存溢出 2. **IO密集型任务** - 可设置较大核心线程数(如CPU核心数*2) - 最大线程数可适当放大 - 配合较长的keepAliveTime(如5-10分钟) 3. **队列选择策略** - `SynchronousQueue`:直接传递任务,适合短任务 - `LinkedBlockingQueue`:无界队列需防内存溢出 - `ArrayBlockingQueue`:有界队列推荐配合拒绝策略[^2]
评论 49
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值