目录
前言
流程图-线程池参数是如何工作的
threadFactory
corePoolSize
workQueue
maximumPoolSize
handler
keepAliveTime和unit
前言
Java线程池和它的七个小参数
流程图-线程池参数是如何工作的
threadFactory
创建线程用的线程工厂。
不设置这个参数会使用默认的线程工厂。
可以通过实现ThreadFactory接口的方式,自定义线程工厂。自定义的线程工厂,可以根据需要为每个线程设置不同的线程名,例如在线程名里带入机房编号、线程用途等。
corePoolSize
核心线程数。
线程池刚初始化时,线程数量为0。
当有新的任务提交到线程池且没有空闲线程,如果当前线程数量小于corePoolSize,那么会创建新的线程来执行这个新任务。
workQueue
工作队列。
当有新的任务提交到线程池且没有空闲线程,如果当前线程数量达到了corePoolSize,那么会将任务暂存在工作队列里。
Java提供了四种工作队列:
- ArrayBlockingQueue:有界阻塞队列,先进先出,底层是数组。
- LinkedBlockingQuene:无界阻塞队列(实际上最大容量为Interger.MAX),先进先出,底层是链表
- SynchronousQuene:大小为0的阻塞队列。
- PriorityBlockingQueue:无界阻塞队列(实际上最大容量为Interger.MAX),按优先级取任务,底层是平衡二叉树
maximumPoolSize
最大线程数。
当有新的任务提交到线程池且没有空闲线程,如果工作队列已经满了,且当前线程数量小于maximumPoolSize,那么会创建新的线程来执行这个新任务。
注意这里新提交进来的任务,会先于之前提交到工作队列中的任务执行,极端情况下,空闲线程会一直被新提交进来的任务抢占,导致工作队列里的任务一直没有机会被执行。
handler
拒绝策略。
当有新的任务提交到线程池且没有空闲线程,如果工作队列已经满了,且当前线程数量达到了maximumPoolSize,那么会执行拒绝策略。
Java提供了四种拒接策略
- AbortPolicy:丢弃任务,并抛出RejectedExecutionException异常。AbortPolicy是线程池默认拒绝策略。
- CallerRunsPolicy:在调用线程池的线程中执行任务。
- DiscardPolicy:只丢弃任务,不做其他事情。
- DiscardOldestPolicy:丢弃工作队列里的第一个任务,然后尝试将新任务加入工作队列
keepAliveTime和unit
keepAliveTime是线程允许的最大空闲时间,unit是keepAliveTime的单位,TimeUnit类里定义了unit相关常量。
当线程数量大于corePoolSize时,如果有线程的空闲时间超过keepAliveTime,那么会回收这个空闲线程。
如果设置了allowCoreThreadTimeOut,那么即使线程数量小于corePoolSize,有线程空闲时间超过keepAliveTime也会被回收。