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
在这种策略下,丢弃最早进入队列的任务,然后尝试将被拒绝的任务放入队列中。
至此,构造线程池时的七个参数全部介绍完毕。
个人独立博客: