首页 > 其他分享 >为什么不能使用Executors创建线程池

为什么不能使用Executors创建线程池

时间:2023-03-18 15:46:57浏览次数:42  
标签:Executors 队列 创建 线程 MAX Integer

Exrcutor

Executors是一个Java中的工具类。提供工厂方法来创建不同类型的线程池。如下所示:

  • newFixedThreadPool(int nThreads):创建固定数目线程的线程池。
  • newCachedThreadPool():创建一个可缓存的线程池,调用execute将重用以前构造的线程(如果线程可用)。如果没有可用的线程,则创建一个新线程并添加到线程池中。终止并从缓存中移除那些已有60秒钟未被使用的线程。
  • newSingleThreadExecutor():创建一个单线程化的Executor。
  • newScheduledThreadPool(int corePoolSize):创建一个支持定时及周期性的任务执行的线程池,多数情况下可用来替代Timer类。

为什么不用

  1. FixedThreadPool和SingleThreadPool:允许的阻塞队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM。
  2. CachedThreadPool和ScheduledThreadPool:允许的创建线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM。
  3. 真正导致OOM的其实是LinkedBlockingQueue.offer方法:Java中的BlockingQueue主要有两种实现,分别是ArrayBlockingQueue和LinkedBlockingQueue。
  • ArrayBlockingQueue是一个用数组实现的有界阻塞队列,必须设置容量。
  • LinkedBlockingQueue是一个用链表实现的有界阻塞队列,容量可以选择进行设置,不设置的话,将是一个无边界的阻塞队列,最大长度为Integer.MAX_VALUE.

正确创建

以自己直接调用ThreadPoolExecutor的构造函数来自己创建线程池,在创建的同时,给BlockQueue指定容量

参考链接:https://blog.csdn.net/ARPOSPF/article/details/120276045

标签:Executors,队列,创建,线程,MAX,Integer
From: https://www.cnblogs.com/yliunyue/p/17230882.html

相关文章

  • JAVA线程锁基础
    https://blog.csdn.net/qq_33375499/article/details/105161343Synchnized和lock的区别Synchronized是悲观锁CAS是乐观锁 锁的状态 无锁->偏向锁->轻量级锁->......
  • 多线程基础
     基本概念:程序、进程、线程程序(program):为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。进程(process):是指一个内存中运行......
  • 线程池中阻塞队列的作用?为什么是先添加列队而不是先创建最大线程?
    线程池中阻塞队列的作用:1.⼀般的队列只能保证作为⼀个有限⻓度的缓冲区,如果超出了缓冲⻓度,就⽆法保留当前的任务了,阻塞队列通过阻塞可以保留住当前想要继续⼊队的任务。2.......
  • c++ 影响多线程速度的因素记录
    目录0.序言1.缓存行同步问题/共享数据竞争1.1测试代码1.2测试逻辑1.3测试结果1.4小结2.任务颗粒度过小问题2.1测试代码2.1测试逻辑2.2测试结果2.3小结3.缓存未......
  • linux驱动创建节点文件(device和class方式)
    概述创建sys目录下的属性节点有三种方式device_create_fileclass_create_filedriver_create_file我们常用的是第一个和第二个,这三者的主要区别在第一个参数上,device......
  • 谈谈线程间的协作(wait/notify/sleep/yield/join)
    线程的状态Java中线程中状态可分为五种:New(新建状态),Runnable(就绪状态),Running(运行状态),Blocked(阻塞状态),Dead(死亡状态)。New:新建状态,当线程创建完成时为新建状态,即newThread......
  • 线程间通信
    参考:https://zhuanlan.zhihu.com/p/452313580https://zhuanlan.zhihu.com/p/34362413https://zhuanlan.zhihu.com/p/151289085https://www.cnblogs.com/bearbrick0/p/1......
  • 为什么用线程池?解释一下线程池参数?
    1、降低资源消耗;提高线程利用率,降低创建和销毁线程的消耗。2、提高响应速度;任务来了,直接有线程可用可执行,而不是先创建线程,再执行3、提高线程的可管控性;线程是稀缺资源,使......
  • 为什么用线程池?解释一下线程池参数?
    1、降低资源消耗;提高线程利用率,降低创建和销毁线程的消耗。2、提高响应速度;任务来了,直接有线程可用可执行,而不是先创建线程,再执行3、提高线程的可管控性;线程是稀缺资源,使......
  • 谈谈ConcurrentHashMap是如何保证线程安全的?
    jdk1.7中是采用Segment+HashEntry+ReentrantLock的方式进行实现的,而1.8中放弃了Segment臃肿的设计,取而代之的是采用Node+CAS+Synchronized来保证并发安全进行实现......