参数 | 意义 |
---|---|
corePoolsize | 线程池核心线程数 |
workQueue | 存放提交的task |
maximumPoolSize | 线程池中允许最大线程数 |
threalFactory | 线程工厂,用于创建线程,由Excutors#defultThrealFactory实现 |
keepAliveTime | 空闲线程存活时间(默认是临时线程,也可设置为核心线程) |
unit | 空闲时间线程存活时间单位枚举 |
线程池流程
1.当workers.size()小于corePoolSize时, 创建新的线程执行提交的task
2.当workers.size()大于corePoolSize时, 并且workQueue没有满将task添加到workQueue.
3.当workers.size()大于corePoolSize时,并且workQueue已经满了,workers.size()<maximumPoolSize,就创建一个临时线程处理task
4.当workers.size()大于corePoolSize时, 并且workQueue已经满了, 并且workers.size()>=maximumPoolSize, 执行拒绝策略
4种默认的拒绝策略:
ThreadPoolExecutor默认实现的4种拒绝策略.
- AbortPolicy -- 当任务添加到线程池中被拒绝时,它将抛出 RejectedExecutionException 异常。
- CallerRunsPolicy -- 当任务添加到线程池中被拒绝时,会在线程池当前正在运行的Thread线程池中处理被拒绝的任务。
- DiscardOldestPolicy -- 当任务添加到线程池中被拒绝时,线程池会放弃等待队列中最旧的未处理任务,然后将被拒绝的任务添加到等待队列中。
- DiscardPolicy -- 当任务添加到线程池中被拒绝时,线程池将丢弃被拒绝的任务。
预定义线程池4种线程池
ThreadPoolExecutor提供了四个构造方法:
- FixedThreadPool 固定大小的线程池
private final ExecutorService executorService = new ThreadPoolExecutor(10, 50,
60L, TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(), new ThreadFactoryBuilder()
.build(), new ThreadPoolExecutor.AbortPolicy());
适用场景:可用于Web服务瞬时削峰,但需注意长时间持续高峰情况造成的队列阻塞。
- CachedThreadPool 可缓存线程池
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
适用场景:快速处理大量耗时较短的任务,如Netty的NIO接受请求时,可使用CachedThreadPool。
- SingleThreadExecutor 单例线程池
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
适用场景:创建一个单线程的线程池,适用于需要保证顺序执行各个任务。
- ScheduledThreadPool 调度线程池
内容比较多 可自行度娘