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

线程池不允许使用 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. ESP-12F模块转接板测试版调试说明,下载MicroPython程序。ESP8266-12F
  2. HD 2602 Bone Collector (0-1背包)
  3. 【VS开发】PCIe体系结构的组成部件
  4. excel 宏编程_在 Excel 中使用 Python 开发宏脚本
  5. 对The Curse of Dimensionality(维度灾难)的理解
  6. linux下时间同步的两种方法分享
  7. oracle出错如何备份数据,备份oracle数据库出错
  8. 【牛客 - 185D】星光晚餐(数论,结论,思维,模型)
  9. centos7-docker-网络配置
  10. 在uipath_UiPath狂欢节Day 3——国内超级企业CFO大咖RPA案例分享!
  11. html文件整体结构,HTML文件基本结构
  12. @RequestParam今天才知道是咋用的..
  13. 【52.55%】【BZOJ 4520】K远点对
  14. 苹果基带芯片“分家” 一箭多雕
  15. DOS 系统安装工具
  16. notifyIcon 用法
  17. 微型计算机原理与接口技术综述论文,微型计算机原理接口与技术综述论文汇编.doc...
  18. c语言%hx输出大写,C语言输出函数printf
  19. vim代码格式化插件clang-format
  20. ARM hint instruction-WFI(Wait For Interrupt)指令的一些笔记

热门文章

  1. 【Python基础】安利3个Python数据分析EDA神器!
  2. 推荐系统炼丹笔记:推荐算法特征交叉新方式CAN
  3. 技术宝典 | NeCodeGen:基于 clang 的源到源转译工具
  4. 互联网1分钟 |1229
  5. Selenium 获取文本信息方法+select(定位)
  6. 如何利用 Myflash 解析 binlog ?
  7. flask开发问题小记
  8. java使用httpclient调用上传图片接口[示例]
  9. jquery easyui dataGrid动态改变排序字段名
  10. How to Review a Paper