Java线程池创建详解:核心参数corePoolSize、maximumPoolSize等七大参数解析

大家好,我们又见面了,我是你们的朋友全战军。

Java线程池创建详解:核心参数corePoolSize、maximumPoolSize等七大参数解析

Java多线程开发中经常会用到线程池技术。本文详细讲解了创建Java线程池时的七个参数。

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

1. corePoolSize 线程池核心线程大小

线程池中将维护最小数量的线程。即使这些线程处理空闲状态,它们也不会被销毁,除非设置了allowCoreThreadTimeOut。这里的最小线程数是 corePoolSize。

2、maximumPoolSize 线程池最大线程数

一个任务提交到线程池后,首先会查找是否有空闲的存活线程。如果有,则直接将任务交给空闲线程执行。如果没有,就会缓存到工作队列中(后面会介绍)。如果工作队列满了,就会创建一个新的线程,从工作队列的头部取出一个任务交给新线程处理,新提交的任务会放在尾部工作队列的。线程池不会无限制地创建新线程。它会对最大线程数有限制,该限制由 MaximumPoolSize 指定。

3. keepAliveTime 空闲线程生存时间

如果某个线程处于空闲状态,并且当前线程数大于 corePoolSize,则空闲线程将在指定时间后被销毁。这里指定的时间是通过keepAliveTime设置的

4.单位空闲线程生存时间单位

keepAliveTime的计量单位

5.workQueue工作队列

新任务提交后,首先会进入工作队列,然后在任务调度时将该任务从队列中取出。 jdk中提供了四种工作队列:

①数组阻塞队列

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

②LinkedBlockingQuene

基于链表的无界阻塞队列(实际上最大容量为Interger.MAX),按照先进先出排序。由于队列近似无界的性质,当线程池中的线程数量达到corePoolSize时,新的任务将被存储在队列中,而不会创建新的线程,直到maxPoolSize。因此,在使用这个工作队列时,参数 maxPoolSize 实际上是不起作用的。

③同步队列

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

④优先级阻塞队列

一个带有优先级的无界阻塞队列,优先级是通过参数Comparator来实现的。

6.threadFactory线程工厂

创建新线程时使用的工厂可以用来设置线程名称、是否为守护线程等。

7. 处理程序拒绝策略

当工作队列中的任务已经达到最大限制,并且线程池中的线程数也达到最大限制时,如果提交了新的任务该怎么办?这里的拒绝策略就是为了解决这个问题。 JDK提供了4种拒绝策略:

①来电运行策略

在这种策略下,被拒绝任务的run方法直接在调用者线程中执行。除非线程池已经关闭,否则直接放弃任务。

②中止策略

在这种策略下,任务会被直接丢弃,并抛出RejectedExecutionException。

③废弃政策

在这种策略下,任务被简单地丢弃,什么也不做。

④丢弃OldestPolicy

在这种策略下,丢弃最早进入队列的任务,然后尝试将被拒绝的任务放入队列中。

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

个人独立博客:

你可能想看:
« 上一篇
下一篇 »

相关推荐

java中什么是冒泡,冒泡算法

2026年09月06日

27阅读

java中冒号,java双冒号

2026年09月06日

26阅读

java中的->,java中的是什么意思

2026年09月06日

24阅读

java中的super用法,Java中super的说明

2026年09月06日

28阅读

java中反射的应用,java中反射的应用场景

2026年09月06日

25阅读

java中开关的定义,Java关键字有哪些

2026年09月06日

25阅读