线程池参数的大致理解
基于ThreadPoolExecutor 的参数进行分析
-
corePoolSize
(核心线程数):线程池最少线程数的一项标准,即使空闲线程再多,也不会进行销毁,除非设置了allowCoreThreadTime
参数。 -
maximumPoolSize
(线程池最大线程数量):当有任务被提交到线程池后,首先会检查是否有空闲线程,如果有,则将当前的任务提交给空闲线程进行处理,若是没有空闲线程,则会将当前任务放入到工作队列的尾部,直到工作队列被填满,这时,会取出工作队列的队首任务并且创建一个新的线程去执行该任务。这个创建的线程数量并不是无限大的,而是以maximumPoolSize
作为标准,若是到达了临界点,再有任务进入到线程池中,并且工作队列是满载的,此时就会执行拒绝策略。 -
keepAliveTime
(空闲线程存活时间):如果一个线程处于空闲状态,并且线程数量大于核心线程数时,在指定时间之后,线程将会被销毁,这个指定时间是由keepAliveTime
决定的。 -
unit
(空闲线程存活时间的单位):keepAliveTime
的时间单位。 -
WorkQueue
(工作队列):新任务进入到线程池中,首先会判断是否具有空闲线程,若是不存在空闲线程,并且线程数达到了核心线程数时,任务会进入到工作队列中。- 四大工作队列:
ArrayBlockingQueue
: 基于数组的有界阻塞队列,按照FIFO的规则,新任务进入到队列时会被放入队尾,有界避免了资源被消耗殆尽。当线程数量到达了核心线程数,此时会将任务放入到队列中,直到队列被占满,才会创建一个新的线程来执行队首任务,当线程数量到达了最大线程数时,在有任务进来,则会执行拒绝策略。LinkedBlockedQueue
: 基于链表的无界阻塞队列(最大容量是IntegerMax
),按照FIFO的规则,由于该队列的特性,在线程数到达了核心线程数时,新进的任务会一直存放在该队列中。SynchronousQueue
:一个不缓存任务的阻塞队列,生成者放入一个任务必须等到消费者进来消费,也就是说,该任务只要一进入到队列,并且无空闲线程和线程数量达到了核心线程数时,就会立刻创建线程,直到到达最大线程数,若后续还有线程进入,则直接执行拒绝策略。PriorityBlockedQueue
:具有优先级的阻塞队列,优先级通过参数Comparator实现。
- 四大工作队列:
-
ThreadFactory
(线程工厂):创建一个新线程时使用的工厂,可以用来设定线程名、是否为daemon线程等等。 -
handler
(拒绝策略):当工作队列中的任务已到达最大限制,并且线程池中的线程数量也达到最大限制,这时就会执行拒绝策略四种拒绝策略:
AbortPolicy
:该策略下,直接丢弃任务,并抛出RejectedExecutionException
异常。
CallerRunsPolicy
:该策略下,在调用者线程中直接执行被拒绝任务的run方法,如果线程池已经shutdown,则直接抛弃任务。
DiscardPolicy
: 该策略下,直接丢弃任务,什么都不做。
DiscardOldestPolicy
:该策略下,抛弃进入队列最早的那个任务,然后尝试把这次拒绝的任务放入队列。
本文借鉴了一些网上的解析,并且结合了一些自己的见解,用于当作自己的学习笔记。可能本文中会有一些错误,希望大家多多包含并且指出问题,同时也希望能帮助到大家。