ThreadPoolExecutor
通用构造函数:
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
}
corePoolSize
: 基本大小
没有任务执行时线程池的大小,并且只有在工作队列满了的情况下才会创建超出这个数量的线程。
maximumPoolSize
:最大大小
可同时活动的线程数量的上限
keepAliveTime
、unit
:存活时间
如果某个线程的空闲时间超过了存活时间,那么将被标记为可回收的,并且当线程池的当前大小超过了基本大小时,这个线程将被终止。
workQueue
:工作队列
ThreadPoolExecutor
允许提供一个BlockingQueue
来保存等待执行的任务。
- 无界队列
newFixedThreadPool
、newSingleThreadExecutor
默认将使用一个无界的LinkedBlockingQueue
(无限制的增加) - 有界队列
2.1 有界的LinkedBlockingQueue
,ArrayBlockingQueue
:先进先出(FIFO)
2.2PriorityBlockingQueue
:根据优先级(自然顺序或Comparator
)
有界队列填满后,新的任务该怎么办?饱和策略 - 同步移交
同步移交使用SynchronousQueue来避免任务排队,以及直接将任务从生产者移交给工作者线程。
SynchronousQueue不是一个真正的队列,而是一个线程之间进行移交的机制。将一个元素放入SynchronousQueue中,必须有另外一个线程正在等待接受这个元素。如果没有并且当前线程池的大小小于最大值,则创建一个新的线程,否则这个任务将被拒绝。
RejectedExecutionHandler handler
: 饱和策略
- AbortPolicy 默认策略
抛出未检查的RejectedExecutionException
/**
* A handler for rejected tasks that throws a
* {@code RejectedExecutionException}.
*/
- DiscardPolicy
抛弃该任务 - DiscardOldestPolicy
抛弃下一个将被执行的任务,重新尝试提交新任务 - CallerRunsPolicy
既不会抛弃任务也不会抛出异常;
将任务回退到调用者,该任务会在调用者主线程中执行。
threadFactory
:线程工厂
每当线程池需要创建一个线程时,都是通过线程工厂方法来完成的。
默认的线程工厂方法将创建一个新的、非守护线程,并且不包含特殊的配置信息。