前言
我们知道,即使是在单线程模式下,我们也要尽量使用Executor。即:
//创建固定线程池,然而阿里手册明文禁止Executors创建线程池
private static ExecutorService fixThreadPool = Executors.newFixedThreadPool(1);
阿里手册明文禁止Executors创建线程池,如下
【强制】线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。
Executors 返回的线程池对象的弊端如下:
FixedThreadPool 和 SingleThreadPool : 允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。CachedThreadPool 和 ScheduledThreadPool : 允许的创建线程数量为 Integer.MAX_VALUE,可能会创建大量的线程,从而导致 OOM。
分析
我们想一下,既然jdk为我们提供了 Executors 创建线程池,那就有存在的价值,像阿里这种体量的公司,全世界又有几家? 队列和线程数量能过突破Integer.MAX_VALUE屈指可数,所以绝大多数公司和业务是可以使用Executors创建线程池的。下面使用Executors创建线程池的例子
//创建固定线程池
private static ExecutorService fixThreadPool = Executors.newFixedThreadPool(15);
public static void main(String[] args) {
int cnt = 10;
for