(1)核心线程数(corePoolSize)
默认情况下,如果线程池中线程的数量小于核心线程数(corePoolSize),那么这些线程即使处于空闲状态也不会被销毁。
(2)最大线程数(maximumPoolSize)
当一个任务提交到线程池,如果此时线程池中有空闲线程就会直接执行这个任务,如果此时线程池中没有空闲线程并且线程池中线程的数量小于核心线程数(corePoolSize),那么就会创建一个新线程来执行这个任务,否则就会将这个任务加入到阻塞队列,然后从阻塞队列的头部取出一个任务执行,再将新任务加入到阻塞队列的末尾;但是如果此时线程池中线程的数量大于最大线程数(maximumPoolSize),那么就不会创建新线程,而是直接执行拒绝策略(handler)。
(3)空闲线程存活时间(keepAliveTime)
默认情况下,如果线程池中线程的数量大于核心线程数(corePoolSize),并且此时某个线程的存活时间已经超过了空闲线程存活时间(keepAliveTime),那么这个线程就会被销毁。
(4)时间单位(unit)
它是空闲线程存活时间(keepAliveTime)的基本单位。
(5)工作队列(workQueue)
当线程池中没有空闲线程去执行新任务的时候,这个任务就会被加入到该队列中等待执行。
常见队列类型包括:
ArrayBlockingQueue
:有界数组队列,需指定容量;LinkedBlockingQueue
:链表队列,默认无界(可指定容量);SynchronousQueue
:无缓冲队列,直接传递任务给线程,不存储;PriorityBlockingQueue
:优先级队列,按任务优先级排序。
(6)线程工厂(threadFactory)
主要用于创建新线程的工厂类,可自定义线程的名称、优先级等属性。
(7)拒绝策略(handler)
当线程池(线程数达最大值且队列已满)无法接收新任务时,触发拒绝策略。
Java 默认提供 4 种策略:
-
AbortPolicy
(默认):线程池默认的拒绝策略,当添加失败时,接抛出RejectedExecutionException
,终止任务; -
CallerRunsPolicy
:当添加失败时,主线程会自己调用执行器中的execute()方法来执行这个被拒绝的任务,但是如果此时线程池已经关闭,那么这个任务就会被丢弃。 -
DiscardPolicy
:当添加失败时,直接丢弃新任务,不抛出异常; -
DiscardOldestPolicy
:当添加失败时,会丢弃队列中最早添加的任务(队首任务),并不断尝试加入新任务。