为什么阿里巴巴 Java 编码规范中不建议使用 Executors 工具类创建线程池?请说明理由。
阿里的Java开发手册中建议不要使用Executors去创建线程池,主要有以下几个原因:
- 资源控制:Executors创建的线程池大多数是使用无界队列,比如Executors.newFixedThreadPool、Executors.newSingleThreadExecutor。这意味着如果任务提交速度持续大于处理速度,会造成队列大量积压任务,最终可能会导致OOM(Out of Memory)。
-
参数不透明:使用Executors创建线程池,我们无法明确其默认配置,比如其默认的队列是LinkedBlockingQueue,队列大小是Integer.MAX_VALUE,这是一个几乎无限大小的队列,很容易造成OOM。
-
灵活性较差:Executors创建的线程池,其实现细节我们无法控制,比如它默认的拒绝策略是AbortPolicy,这种策略会在拒绝任务时抛出一个未检查的RejectedExecutionException,而这可能不是我们想要的。
因此,阿里推荐直接使用ThreadPoolExecutor的构造方法创建线程池,这样可以清楚地控制参数,明确线程池的运行规则,避免资源耗尽的风险。