持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情
我们来看看阿里开发规范中的怎么说的
- 【强制】线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样 的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。 说明:Executors 各个方法的弊端: 1)newFixedThreadPool 和 newSingleThreadExecutor: 主要问题是堆积的请求处理队列可能会耗费非常大的内存,甚至 OOM。 2)newCachedThreadPool 和 newScheduledThreadPool: 主要问题是线程数最大数是 Integer.MAX_VALUE,可能会创建数量非常多的线程,甚至 OOM。

创建线程池的方式:
Executors.newSingleThreadExecutor(); 创建简单的线程池
Executors.newCachedThreadPool(); 带有自动缓存的线程池
Executors.newScheduledThreadPool(10); 定时执行的线程池
Executors.newFixedThreadPool(2); 固定线程的线程池
分析线程池的7大参数 官方说的:
- @param corePoolSize 保留在池中的线程数
- @param maximumPoolSize 池中允许的最大线程数
- @param keepAliveTime 当线程数更大时与核心相比,这是多余的空闲线程在终止之前等待新任务的最长时间。
- @param unit {@code keepAliveTime} 参数的时间单位
- @param workQueue 用于在执行任务之前保存任务的队列。
- @param threadFactory 执行器创建新线程时使用的工厂
- @param handler 当执行被阻塞时使用的处理程序,因为达到了线程边界和队列容量
自定义线程池 核心线程数量怎么设定(最好在利用公司压测选择合理的数量)
- CPU核心数*(1+CPU等待时间/每条线程的执行时间)
直接分析源码
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
threadFactory, defaultHandler);
}

- 柜台1-2-3 :核心线程数(3)corePoolSize
- 柜台1-2-3-4-5:最大线程数(5)
- 排队:等待队列 workQueue
- 拒绝策略:再来第6个客户直接拒绝:handler
- 定制化柜台业务:threadFactory
- unit :时间单位
- keepAliveTime 时间数值
一个一个脚印
文章持续更新 宝宝们