关于阿里开发手册不让用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值