在我阅读阿里巴巴开发手册的时候,有一段关于多线程的描述:

线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样 的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。 说明: Executors 返回的线程池对象的弊端如下: FixedThreadPool 和 SingleThreadPool : 允许的请求队列长度为 Integer.MAX_VALUE ,可能会堆积大量的请求,从而导致 OOM 。 CachedThreadPool 和 ScheduledThreadPool : 允许的创建线程数量为 Integer.MAX_VALUE ,可能会创建大量的线程,从而导致 OOM 。

当看到不允许使用Executors创建线程池的时候,我有点懵,仔细一看不无道理。

我们来逐个分析。

FixedThreadPool 和 SingleThreadPool

这两个线程池是线程池大小是固定的。SingleThreadPool是单个线程的线程池。FixedThreadPool在应对平稳流量的时候,能有效的处理,缺点就是可能无法应付突发性大流量。

使用Executors创建:

ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(10);

我们点开方法看一下:

public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}

两个方法,都通过了 LinkedBlockingQueue<Runnable>来接收来不及处理的任务。关键点就在这个队列里,默认的构造器容量是Integer.MAX_VALUE。

public LinkedBlockingQueue() {this(Integer.MAX_VALUE);}

那就是说,当流量突然变得非常大时,线程池满,等候队列变得非常庞大,内存和CPU都告急,这样无疑对服务器造成非常大的压力。

CachedThreadPool 和 ScheduledThreadPool

ExecutorService cacheThreadPool = Executors.newCachedThreadPool();
public static ExecutorService newCachedThreadPool() {return new ThreadPoolExecutor(0, Integer.MAX_VALUE,60L, TimeUnit.SECONDS,new SynchronousQueue<Runnable>());}
ExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(10);
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) {return new ScheduledThreadPoolExecutor(corePoolSize);}
public ScheduledThreadPoolExecutor(int corePoolSize) {super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,new DelayedWorkQueue());}

同理,从工厂方法可以看到,这两种线程池,线程池大小是不固定的,虽然newScheduledThreadPool传如一个线程数,但是这个数字只是核心线程数,可能还会扩容,直至Integer.MAX_VALUE。而他们使用的队列是SynchronousQueue和DelayedWorkQueue。这两个队列我没有细看,但初始化时不会像LinkedBlockingQueue那样一下子将容量调整到最大。

总结:阿里手册希望程序员们根据业务情况,通过ThreadPoolExecutor手动地去创建线程池,线程池大小应该有个边界,并选取合适的队列存储任务。

为什么阿里巴巴Java开发手册中不允许用Executors去创建线程池?相关推荐

  1. char怎么比较_为什么阿里巴巴Java开发手册中强制要求整型包装类对象值用 equals 方法比较?...

    在阅读<阿里巴巴Java开发手册>时,发现有一条关于整型包装类对象之间值比较的规约,具体内容如下: 这条建议非常值得大家关注, 而且该问题在 Java 面试中十分常见. 还需要思考以下几个 ...

  2. 19位整数 java_为什么阿里巴巴Java开发手册中强制要求超大整数禁止使用Long类型返回?...

    在阅读<阿里巴巴Java开发手册>时,发现有一条关于前后端超大整数返回的规约,具体内容如下: 这个问题在之前和前端联调的时候发生过,发现根据脚本 id 去审批的时候,状态没有变化,后来和前 ...

  3. 阿里巴巴Java开发手册中的DO、DTO、BO、AO、VO、POJO定义

    分层领域模型规约: DO( Data Object):与数据库表结构一一对应,通过DAO层向上传输数据源对象. DTO( Data Transfer Object):数据传输对象,Service或Ma ...

  4. java不进入for_为什么阿里巴巴Java开发手册中强制要求不要在foreach循环里进行元素的remove和add操作?...

    在阅读<阿里巴巴Java开发手册>时,发现有一条关于在 foreach 循环里进行元素的 remove/add 操作的规约,具体内容如下: 错误演示 我们首先在 IDEA 中编写一个在 f ...

  5. 为什么阿里巴巴Java开发手册中强制要求接口返回值不允许使用枚举?

    在阅读<阿里巴巴Java开发手册>时,发现有一条关于二方库依赖中接口返回值不允许使用枚举类型的规约,具体内容如下: 在谈论为什么之前先来科普下什么是二方库,二方库也称作二方包,一般指公司内 ...

  6. 为什么阿里巴巴Java开发手册中强制要求不要在foreach循环里进行元素的remove和add操作...

    在阅读<阿里巴巴 Java 开发手册>时,发现有一条关于在 foreach 循环里进行元素的 remove/add 操作的规约,具体内容如下:"不要在foreach循环里进行 r ...

  7. 回顾阿里巴巴Java开发手册中分层领域模型规约之DO,DTO,BO,AO,VO,POJO

    一 DO DO即Data Object:与数据库表结构一一对应,通过DAO层向上传输数据源对象. 二 DTO DTO即Data Transfer Object:数据传输对象,Service层向外传输的 ...

  8. 关于并发处理,下列哪些说法符合《阿里巴巴Java开发手册》

    关于并发处理,下列哪些说法符合<阿里巴巴Java开发手册>:答案在文末 A. 线程资源必须通过线程池提供,不允许在应用中自行显式创建线程. B. 同步处理时,能锁部分代码区块的情况下不要锁 ...

  9. 阿里巴巴java开发手册学习

    本文对阿里巴巴java开发手册中需要注意的点予以记录 1.编程规约 类名中包含领域模型如DO/BO/DTO/VO时要 全部大写,如UserDTO. 抽象类要以Abstract或Base开头,异常类以E ...

最新文章

  1. 北京夯实人工智能产业高地 关键核心技术不断突破
  2. 部署项目到阿里云服务器上遇到的问题
  3. linux centos7挂载/dev/sdb硬盘到根目录(根目录扩容新磁盘)
  4. Docker Registry本地私有仓库搭建
  5. java类的定义的实例_《Java基础知识》Java类的定义及其实例化
  6. Python+Appium实现APP自动化测试
  7. 南开计算机与控制工程学,2017南开大学计算机与控制工程学院考研复试名单
  8. android手机 办公软件,Android手机办公软件推荐:WPS移动版(Kingsoft Office)
  9. 年会抽奖程序,开箱即用
  10. 使用夜神模拟器完美破解(反编译)微信小程序以及问题汇总
  11. 手把手教你如何PCB板材选型(一)
  12. HDU 4114 Disney's FastPass
  13. hadoop-2.6下载地址
  14. C++STL容器总结
  15. clo6|clo standalone 6(3D服装设计软件) v6.0.328.32100
  16. python mk趋势检验_求问!MK趋势检验和突变检验!
  17. 收藏:中国FPGA芯片技术解析
  18. 产品经理怎样活着走出需求评审会?
  19. win2003文件共享
  20. Kernel K-means1

热门文章

  1. 【数据竞赛】从0梳理1场CV缺陷检测赛事!
  2. 解决Github速度太慢的几种方案
  3. 《交互式线性代数》完整版正式发布!支持在线全交互式体验(含源码,离线也能看)...
  4. 10种常用降维算法源代码(python)
  5. 【内有网易黑猪肉券福利】网易MCTalk首秀——在线教育是一场马拉松
  6. 为什么互联网能创造商业奇迹——我的互联网产品观
  7. C# HttpWebResponse WebClient 基础连接已经关闭: 发送时发生错误.
  8. Linux系统故障修复-MBR损坏,grub.conf配置文件丢失
  9. C# OO(初级思想)
  10. Oracle 11g Dataguard 物理备库配置(四)之broker snapshot standby测试