关于阿里开发手册不让用Executor创建线程池的解释

Executors是一个工具类,直接使用Executors可以调用JDK为我们提供的线程池方法。


Executors.newCachedThreadPool(); // 创建可缓存的线程池

Executors.newFixedThreadPool(1); // 创建固定大小的线程池

Executors.newSingleThreadExecutor(); //  创建单线程池

- newCachedThreadPool是一个可缓存的线程池,当线程池的线程数量大于需要执行的任务数量时,则会在60秒后回收掉线程资源。

 当任务量增加,线程池也会创建出对应的线程来执行任务。

newCachedThreadPool源码

- newFixedThreadPool是一个固定大小的线程池,传入的参数是用来设置最大线程数的,如果此时线程都在执行状态,则会向任务队列中放入任务。

newFixedThreadPool源码

- newSingleThreadExecutor是一条单线程的线程池,此线程池可以保证线程按照提交顺序来完成。

newSingleThreadExecutor源码

通过上述源码分析,我们发现newFixedThreadPool和newSingleThreadExecutor方法他们都使用了LinkedBlockingQueue的任务队列,LinkedBlockingQueue的默认大小为Integer.MAX_VALUE。而newCachedThreadPool中定义的线程池大小为Integer.MAX_VALUE。

所以阿里禁止使用Executors创建线程池的原因就是FixedThreadPool和SingleThreadPool的请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM。

CachedThreadPool允许的创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM。

原文:https://segmentfault.com/a/1190000021657959

发布了740 篇原创文章 · 获赞 65 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/qq_41723615/article/details/104365363