IDEA导入阿里规约插件,当你这样写代码时,插件就会自动监测出来,并给你红线提醒。

告诉你手动创建线程池,效果会更好。

在探秘原因之前我们要先了解一下线程池 ThreadPoolExecutor 都有哪些参数及其意义。

ThreadPoolExecutor 构造方法:

public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler) {//code...
}

 参数的意义:

1.corePoolSize 指定了线程池里的线程数量,核心线程池大小
2.maximumPoolSize 指定了线程池里的最大线程数量
3.keepAliveTime 当线程池线程数量大于corePoolSize时候,多出来的空闲线程,多长时间会被销毁。
4.unit 时间单位
5.workQueue 任务队列,用于存放提交但是尚未被执行的任务。
6.threadFactory 线程工厂,用于创建线程,一般可以用默认的
7.handler 拒绝策略,当任务过多时候,如何拒绝任务。当提交任务数超过maximumPoolSize + workQueue 的size之和,任务交给RejectedExecutionHandler 处理

阿里规约之所以强制要求手动创建线程池,也是和这些参数有关。具体为什么不允许,规约是这么说的:

线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险。

说明:Executors各个方法的弊端:
1)newFixedThreadPool和newSingleThreadExecutor:
  主要问题是堆积的请求处理队列可能会耗费非常大的内存,甚至OOM。
2)newCachedThreadPool和newScheduledThreadPool:
  主要问题是线程数最大数是Integer.MAX_VALUE,可能会创建数量非常多的线程,甚至OOM。

看一下这两种弊端怎么导致的。

第一种是因为,创建了一个size为Integer.MAX_VALUE的线程阻塞队列,可能会堆积大量的请求,消耗很大的内存,甚至导致OOM。

第二种是因为,创建了的线程池允许的最大线程数是Integer.MAX_VALUE,可能会创建大量的线程,消耗资源,甚至导致OOM。

这两种都是有点极端的,稍微点进去看一下源码就能看出来。

阿里规约提倡手动创建线程池,而非Java内置的线程池,给出的正例如下:

正例1:

//org.apache.commons.lang3.concurrent.BasicThreadFactory
ScheduledExecutorService executorService = new ScheduledThreadPoolExecutor(1,new BasicThreadFactory.Builder().namingPattern("example-schedule-pool-%d").daemon(true).build());

正例2:

ThreadFactory namedThreadFactory = new ThreadFactoryBuilder().setNameFormat("demo-pool-%d").build();//Common Thread Pool
ExecutorService pool = new ThreadPoolExecutor(5, 200,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(1024), namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());pool.execute(()-> System.out.println(Thread.currentThread().getName()));
pool.shutdown();//gracefully shutdown

正例3:

<bean id="userThreadPool"class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"><property name="corePoolSize" value="10" /><property name="maxPoolSize" value="100" /><property name="queueCapacity" value="2000" /><property name="threadFactory" value= threadFactory /><property name="rejectedExecutionHandler"><ref local="rejectedExecutionHandler" /></property>
</bean>
//in code
userThreadPool.execute(thread);

---

关注公众号,编程大道,回复“手册”获取阿里Java开发手册最新版。

转载于:https://www.cnblogs.com/ibigboy/p/11298004.html

为什么阿里Java规约禁止使用Java内置Executors创建线程池?相关推荐

  1. Java多线程(四):使用Executors创建线程池及其注意事项

    文章目录 1. 简介 2. newCachedThreadPool 3. newFiexedThreadPool 4. newSingleThreadExecutor 5. newScheduledT ...

  2. 为什么阿里不允许用Executors创建线程池

    1 文章概述 <阿里巴巴JAVA开发手册>有这样一条强制规定:线程池不允许使用Executors去创建,而应该通过ThreadPoolExecutor方式,这样处理方式更加明确线程池运行规 ...

  3. 为什么阿里巴巴禁止使用 Executors 创建线程池,而是通过 ThreadPoolExecutor 方式?...

    >>号外:关注"Java精选"公众号,菜单栏->聚合->干货分享,回复关键词领取视频资料.开源项目. 1. 通过Executors创建线程池的弊端 在创建线 ...

  4. 阿里内部禁用Executors创建线程池,为什么?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | 何甜甜在吗 来源 | http://rrd.m ...

  5. 为什么阿里内部不允许用Executors创建线程池?

    来源:cnblogs.com/zjfjava/p/11227456.html 1. 通过Executors创建线程池的弊端 在创建线程池的时候,大部分人还是会选择使用Executors去创建. 下面是 ...

  6. 为什么阿里不允许用Executors创建线程池,而是通过ThreadPoolExecutor的方式?

    1.通过Executors创建线程池的弊端 在创建线程池的时候,大部分人还是会选择使用Executors去创建. 下面是创建定长线程池(FixedThreadPool)的一个例子,严格来说,当使用如下 ...

  7. 阿里为何不允许用Executors创建线程池?

    点击下方"IT牧场",选择"设为星标" 作者:雪山上的蒲公英 cnblogs.com/zjfjava/p/11227456.html 1. 通过Executor ...

  8. 阿里为什么禁用Executors创建线程池?

    作者 | 何甜甜在吗 来源 | http://rrd.me/eUh6V 看阿里巴巴开发手册并发编程这块有一条:线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方 ...

  9. 阿里面试官鬼得很,问我为什么他们阿里要禁用Executors创建线程池?

    作者:何甜甜在吗 来源:http://rrd.me/eUh6V 看阿里巴巴开发手册并发编程这块有一条:线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式,通过 ...

最新文章

  1. mediawiki java api_维基百科 MediaWiki API 解析
  2. Java 最常见的 10000+ 面试题及答案整理:持续更新
  3. 用深度学习实现异常检测/缺陷检测
  4. windows环境下32位汇编语言程序设计 90盘_Python 0基础详细教程 环境安装01
  5. @RabbitListener组合注解消费消息
  6. Win32ASM学习[13]:移位指令SHL,SHR,SAL,SAR,ROL,ROR,RCL,RCR,SHLD,SHRD
  7. 《Nmap渗透测试指南》—第7章7.8节后台打印机服务漏洞
  8. linux 锐捷客户端 脚本,常熟理工学院锐捷客户端 for Linux
  9. PhpStorm WebStorm IDEA 官方汉化插件
  10. Tomcat热部署(linux服务器)
  11. 小区报修管理系统c语言,小区物业报修管理系统的设计与实现.pdf
  12. 网络中使用最多的图片格式有哪些
  13. 对计算机硬性环境,温度、湿度、灰尘环境对电脑的影响
  14. 列车停站方案_城市轨道交通列车停站方案
  15. signature=735f4378ec01919f23285d0d2557be19,OPENSSL编程 第二十章 椭圆曲线
  16. 安防行业安全产品分类、趋势分析
  17. cadence 17.2 入门学习3 allegro
  18. 20 函数的极值和最大(小)值
  19. 【云原生Docker系列第三篇】Docker网络模式(在失去的所有人里,我最怀念自己 )
  20. 安卓开发本地视频播放器——扫描本地视频文件显示在gridview上,然后点击播放。

热门文章

  1. Eclipse:定制toString()
  2. angular2-baidu-map网站中使用百度地图
  3. ApacheBench-web性能测试
  4. 备份一张iPhone拍照写入exif中的orientation图片
  5. Hibernate中HQL函数汇总及其说明
  6. solve Ax+By+C=0
  7. IDEA+selenium+TestNG+java+git+maven+jenkins实现Web UI自动化集成
  8. python requests模块使用
  9. maven 简易入门笔记
  10. Windows 8 / 8.1 禁用驱动签名最详细图文教程