为什么不建议用Executors?

Java为什么要创建Executors类? 考虑到ThreadPoolExecutor的构造函数实在是有些复杂,所以Java并发包里提供了一个线程池的静态工厂类Executors,利用Executors你可以快速创建线程池。由下图可见,使用Executors类中提供的几个静态方法来创建线程池,内部实现均使用了 ThreadPoolExecutor 实现,其实都只是ThreadPoolExecutor 类的封装。

不建议使用Executors的最重要的原因是:Executors提供的很多方法默认使用的都是无界的LinkedBlockingQueue(如下图),高负载情境下,无界队列很容易导致OOM,而OOM会导致所有请求都无法处理,这是致命问题。所以强烈建议使用有界队列。  注:LinkedBlockingQueue是有界队列,但是不设置大小的话,就默认为Integer.MAX_VALUE,相当于无界队列了。

Executors 返回的线程池对象的弊端:

1)FixedThreadPool 和 SingleThreadPool:

允许的请求队列长度为 Integer.MAX_VALUE,可能会堆积大量的请求,从而导致 OOM。

2)CachedThreadPool 和 ScheduledThreadPool:

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

关于Executors的更多资料可以参考: https://blog.csdn.net/Henry_Lin_Wind/article/details/103768194

为什么不建议用Executors?相关推荐

  1. Executors.newFixedThreadPool(NTHREADS)线程池数量设置多少合适?

    并发编程中线程池 是跑不了的, 用过线程池的朋友 都会遇到这样的一个问题: 如何合理地估算线程池大小? 怎么样设置 数量,执行效率最高? 怎么样设置 内存消耗最低? 是不是设置 线程池数量越大越好? ...

  2. Java基础加强重温_08:线程不安全、线程同步、线程状态、线程状态切换、线程池(Executors类、newFixedThreadPool)、死锁、Lambda表达式、Stream

    摘要 Java基础加强重温_08: 线程安全(线程安全概念.线程不安全案例). 线程同步(同步代码块.同步方法.Lock锁,锁对象). 线程状态(new新建.Runnable可运行.Blocked锁阻 ...

  3. 由于不知线程池的bug,某Java程序员叕被祭天

    说说你对线程池的理解? 首先明确,池化的意义在于缓存,创建性能开销较大的对象,比如线程池.连接池.内存池.预先在池里创建一些对象,使用时直接取,用完就归还复用,使用策略调整池中缓存对象的数量. Jav ...

  4. 【并发编程】线程池--Executor框架

    简介 我们知道线程池就是线程的集合,线程池集中管理线程,以实现线程的重用,降低资源消耗,提高响应速度等.线程用于执行异步任务,单个的线程既是工作单元也是执行机制,Eexecutor作为灵活且强大的异步 ...

  5. 生产上第一使用线程池后的总结与反思

    生产上与 esb 交互时,因为系统后台造数使得 esb 接收响应报文超时.先将造数逻辑修改成线程池异步调用.第一次使用,记录一下学习的历程. [1]Java向多线程中传递参数的三种方法 https:/ ...

  6. java并发编程面试

    文章目录 1.为什么要使用线程池? 2.你们哪些地方会使用到线程池? 3.线程池有哪些作用? 4.线程池的创建方式? 5.线程池底层是如何实现复用的? 6.ThreadPoolExecutor 核心参 ...

  7. java 线程 定时器_java 多线程定时任务

    一.概述 New Thread的弊端如下: a.每次New Thread新建对象性能差. b.线程缺乏统一的管理,可能无限制的新建线程,相互之间竞争,极可能占用过多的系统资源导致死机 或者 OOM. ...

  8. JAVA day27,28 线程池

    一.线程池 1.线程间通信 概念:多个线程在处理同⼀个资源,但是处理的动作(线程的任务)却不相同. 为什么要处理线程间通信: 多个线程并发执⾏时, 在默认情况下CPU是随机切换线程的,当我们需要多个线 ...

  9. 深入理解java中的线程池

    线程池中各个参数的含义 corePoolSize: 核心池的大小,这个参数跟线程池的实现原理有非常大的关系.**在创建了线程池后,默认情况下,线程池中并没有任何线程,而是等待有任务到来才创建线程去执行 ...

最新文章

  1. intelliJ idea 下载安装
  2. [scala-spark]3. 变量 数据类型 分支与循环
  3. 操作系统:SFTP相关知识介绍
  4. Web Service简介
  5. Docker容器开机自动启动
  6. 大屏监控系统实战(7)-后端整合MybatisPlus并暴露服务
  7. Quick-Cocos2d-x初学者游戏教程2
  8. react dispatch_记 react 项目在 TypeScript 化中的一个坑,以及相应的类型改动
  9. 通过批处理调用SQL*Plus执行批量脚本
  10. node服务器给客户端发消息,上的node.js发送消息客户端 - 服务器 - 客户端上socket.io(Sen...
  11. LAMP架构调优(十)——Apache禁止指定目录PHP解析与错误页面优化
  12. Virtuabox 虚拟机克隆方法
  13. 1088 旅行问题(单调队列优化)
  14. 数据挖掘-贡献度分析
  15. mysql 有没有minus_MySQL实现差集(Minus)和交集(Intersect)
  16. dcn网络与公网_DCN网络安全
  17. java 时分秒 转换 秒_【Java】 秒转时分秒天
  18. 如果你真的想要做好互联网项目 请不要将项目的技术外包
  19. 细数企业级移动应用应该具备的5大特征
  20. 【2020春招记录】网易雷火笔试

热门文章

  1. 去掉数组中重复出现元素的算法
  2. 2011, 完全用 GNU/Linux 工作
  3. 这是用原声js编写的地址选择器,使用select编写的三联选择器
  4. QMUI-Android的一些尝试(圆形进度条、Loading、圆形图片、圆形按钮、椭圆图片)
  5. 什么是堡垒机?堡垒机有什么优势?
  6. 本周聚划算| 避免上班5分钟被开除 直降2000元企业办公实用利器一站全掌握
  7. 搜狗拼音输入法2015 v7.2f 官方版
  8. I have the Dream
  9. 关键词推广怎么做比较好?抖音宣传做关键词推广有哪些好的方法
  10. QTableWidget使用方法详细介绍