线程池构造参数
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory,
RejectedExecutionHandler handler) {
}
- corePoolSize:
核心线程数,即使闲置也会存在于线程池中,除非设置了allowCoreThreadTimeOut参数。
- maximumPoolSize:
最大线程数,线程池最大的线程数量
- keepAliveTime:
闲置线程存活时间
- TimeUnit:
时间单位
- BlockingQueue:
工作队列
- ThreadFactory:
生成线程的工厂
- RejectedExecutionHandler:
拒绝策略
提交任务逻辑
当有新任务提交到线程池,
1 若当前线程数 < corePoolSize,会新建一个线程;
2 当前线程数 < maximumPoolSize,会加入工作队列;
3 当前线程数 < maximumPoolSize,且工作队列满了,会新建一个线程;
4 当前线程数 = max 且工作队列满了,会执行拒绝策略。
线程数 > corePoolSize时,多于的线程会在闲置keepAliveTime后被终止。
工作队列
- ArrayBlockingQueue
有界队列,适合有限的maximumPoolSize
- LinkedBlockingQueue
默认是无界的队列(也可限制队列长度),适用于线程数固定的池子
- SynchronousQueue
无界队列,不会持有任务,适合maximumPoolSize为无界
常见线程池
- newFixedThreadPool
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
corePoolSize = maximumPoolSize,使用无界队列,超过nThreads数量的任务,会在队列中等待。
- newSingleThreadExecutor
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
corePoolSize = 1,maximumPoolSize = 1,使用无界队列
- newCachedThreadPool
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
corePoolSize = 0,maximumPoolSize = Integer.MAX_VALUE,使用无界队列
拒绝策略
- AbortPolicy
抛出异常到主线程
- DiscardPolicy
删除无法执行的任务
- DiscardOldestPolicy
删除队列中最早的任务
- CallerRunsPolicy
主线程执行(该策略提供了简单的反馈控制机制,可以减缓新任务的提交速度)
网友评论