首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在ThreadPoolExecutor中使用LinkedBlockingQueue(Integer.MAX_VALUE)时发生RejectedExecutionException

在ThreadPoolExecutor中使用LinkedBlockingQueue(Integer.MAX_VALUE)时发生RejectedExecutionException是因为线程池的任务队列已满,无法接受更多的任务。

ThreadPoolExecutor是Java中用于管理线程池的类,它可以控制线程的创建、执行和销毁。线程池中的任务队列用于存储等待执行的任务。LinkedBlockingQueue是ThreadPoolExecutor中的一个任务队列实现,它是一个基于链表的阻塞队列,可以无限制地存储任务。

然而,当使用LinkedBlockingQueue(Integer.MAX_VALUE)时,任务队列的容量被设置为Integer的最大值,这意味着任务队列几乎可以无限制地存储任务。当线程池中的线程数已达到最大线程数,并且任务队列已满时,ThreadPoolExecutor会拒绝接受新的任务,并抛出RejectedExecutionException异常。

解决这个问题的方法是调整线程池的参数,包括最大线程数和任务队列的容量。可以根据实际需求来调整这些参数,以确保线程池能够处理所有的任务。如果任务量较大,可以增加线程池的最大线程数或者扩大任务队列的容量。如果任务量较小,可以减少线程池的最大线程数或者缩小任务队列的容量。

腾讯云提供了云计算相关的产品和服务,其中包括云服务器、云数据库、云存储等。您可以参考腾讯云的官方文档来了解更多关于这些产品的信息和使用方法。

参考链接:

  • ThreadPoolExecutor官方文档:https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ThreadPoolExecutor.html
  • 腾讯云官方网站:https://cloud.tencent.com/
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

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

    当一个任务提交,首先会创建一个核心线程来执行任务,如果超过核心线程的数量,将会放入队列,因为LinkedBlockingQueue是长度为Integer.MAX_VALUE的队列,可以认为是无界队列...它和SingleThreadExecutor类似,唯一的区别就是核心线程数不同,并且由于使用的是LinkedBlockingQueue资源有限的时候容易引起OOM异常 # 总结: FixedThreadPool...Integer.MAX_VALUE,可能会创建大量的线程,从而引起OOM异常 这就是为什么禁止使用Executors去创建线程池,而是推荐自己去创建ThreadPoolExecutor的原因 # OOM...,从而使每个线程池可以根据各自的工作负载来调整 阻塞队列 => 推荐使用有界队列,有界队列有助于避免资源耗尽的情况发生 拒绝策略 => 默认采用的是AbortPolicy拒绝策略,直接在程序抛出RejectedExecutionException...处理拒绝策略有以下几种比较推荐: 程序捕获RejectedExecutionException异常,捕获异常对任务进行处理。

    50320

    【小家java】Java的线程池,你真的用对了吗?(教你用正确的姿势使用线程池,Executors使用的坑)

    ---- 【小家java】用 ThreadPoolExecutor/ThreadPoolTaskExecutor 线程池技术提高系统吞吐量(附带线程池参数详解和使用注意事项)这篇文章,我们介绍过了...文中末尾有这样一句描述: 可以通过Executors静态工厂构建线程池,但一般不建议这样使用。 关于这个问题,在那篇文章并没有深入的展开。...我提到的是『不建议』,但是阿里巴巴Java开发手册也明确指出,而且用的词是『不允许』使用Executors创建线程池。 ? 阿里巴巴的规范手册里面说的是严令禁止使用的。...,以上的代码其实已经说了,真正的导致OOM的其实是LinkedBlockingQueue.offer方法。..., new ArrayBlockingQueue(10)); 这种情况下,一旦提交的线程数超过当前可用线程数,就会抛出java.util.concurrent.RejectedExecutionException

    1.8K20

    【Java 线程池】Java 创建线程池的正确姿势: Executors 和 ThreadPoolExecutor 详解

    终止并从缓存移除那些已有 60 秒钟未被使用的线程。 newSingleThreadExecutor()创建一个单线程化的Executor。...其实,在上面的报错信息,我们是可以看出蛛丝马迹的,以上的代码其实已经说了,真正的导致OOM的其实是LinkedBlockingQueue.offer方法。...而newFixedThreadPool创建LinkedBlockingQueue,并未指定容量。..., new ArrayBlockingQueue(10)); 这种情况下,一旦提交的线程数超过当前可用线程数,就会抛出java.util.concurrent.RejectedExecutionException...但是异常(Exception)总比发生错误(Error)要好。 除了自己定义ThreadPoolExecutor外。还有其他方法。这个时候第一间就应该想到开源类库,如apache和guava等。

    33.9K56

    使用 Executors,ThreadPoolExecutor,创建线程池,源码分析理解

    当然 Executors 也是用不同的参数去 new ThreadPoolExecutor 实现的,本文先分析前四种线程创建方式,后分析 new ThreadPoolExecutor 创建方式 使用...LinkedBlockingQueue队列。...每当某个线程执行完成之后就从LinkedBlockingQueue队列取一个。 所以这个是创建固定大小的线程池。...由于corePoolSize为0所以任务会放入SynchronousQueue队列,SynchronousQueue只能存放大小为1,所以会立刻新起线程,由于maxumumPoolSize为Integer.MAX_VALUE...2、当线程数大于等于 corePoolSize并且 workQueue 没有满,放入workQueue 3、线程数大于等于 corePoolSize并且当 workQueue 满,新任务新建线程运行

    642100

    【Java】已解决java.util.concurrent.RejectedExecutionException异常

    是Java并发编程中常见的一个异常,它通常发生使用ExecutorService(如ThreadPoolExecutor)执行异步任务,当任务提交到线程池但线程池无法处理新任务(比如,因为已经关闭了或者达到了其最大容量...Web应用、后台服务或其他需要处理大量并发请求的系统,经常可以看到此类异常的出现。下面,我们将探讨如何解决这一问题。...因为循环是无限的,线程池很快就会饱和,并且由于没有设置自定义的拒绝策略,当线程池无法接受新任务,就会抛出RejectedExecutionException。...当线程池不能接受新任务,它会尝试调用execute的线程运行该任务。 五、注意事项 设计线程池,要充分考虑系统的并发需求和资源限制,合理设置线程池的大小和队列容量。...对于需要长时间运行的任务,建议使用单独的线程或线程池来处理,避免阻塞核心线程池。 使用线程池,要注意优雅地关闭线程池,避免资源泄露。

    40110

    线程池的应用

    如果正在运行的线程数等于corePoolSize,则新任务被添加到队列,直到队列满。当队列满了后,会继续开辟新线程来处理任务,但不超过最大线程数。...只能用ThreadPoolExecutor类,==不可以使用Executors创建== 阿里巴巴规范只能用ThreadPoolExecutor类,==不可以使用Executors创建== 为啥不允许呢?...public LinkedBlockingQueue() { this(Integer.MAX_VALUE); } 结论: ​ 1)FixedThreadPool 和 SingleThreadPool...AbortPolicy(jdk默认策略) AbortPolicy -- 当任务添加到线程池中被拒绝,它将抛出 RejectedExecutionException 异常。...DiscardOldestPolicy -- 当任务添加到线程池中被拒绝,线程池会放弃等待队列中最旧的未处理任务,然后将被拒绝的任务添加到等待队列

    25110

    Java 多线程:彻底搞懂线程池

    通过线程池的 execute() 方法提交的 Runnable 对象将存储该参数。其采用阻塞队列实现。 threadFactory(可选):线程工厂。用于指定为线程池创建新线程的方式。...4 线程池的参数 4.1 任务队列(workQueue) 任务队列是基于阻塞队列实现的,即采用生产者消费者模式, Java 需要实现 BlockingQueue 接口。...LinkedBlockingQueue: 一个由链表结构组成的有界阻塞队列,未指明容量,容量默认为 Integer.MAX_VALUE。...,和 LinkedBlockingQueue 行为一致,但是是无界的阻塞队列。...注意有界队列和无界队列的区别:如果使用有界队列,当队列饱和并超过最大线程数就会执行拒绝策略;而如果使用无界队列,因为任务队列永远都可以添加任务,所以设置 maximumPoolSize 没有任何意义

    53410

    Java多线程:还不懂线程池吗?一文带你彻底搞懂!

    通过线程池的execute()方法提交的Runnable对象将存储该参数。其采用阻塞队列实现。 threadFactory(可选):线程工厂。用于指定为线程池创建新线程的方式。...4 线程池的参数 4.1 任务队列(workQueue) 任务队列是基于阻塞队列实现的,即采用生产者消费者模式,Java需要实现BlockingQueue接口。...LinkedBlockingQueue: 一个由链表结构组成的有界阻塞队列,未指明容量,容量默认为Integer.MAX_VALUE。...,和LinkedBlockingQueue行为一致,但是是无界的阻塞队列。...注意有界队列和无界队列的区别:如果使用有界队列,当队列饱和并超过最大线程数就会执行拒绝策略;而如果使用无界队列,因为任务队列永远都可以添加任务,所以设置maximumPoolSize没有任何意义。

    62800

    线程池参数设计技巧

    执行任务 DiscardPolicy 忽视,什么都不会发生 DiscardOldestPolicy 从队列踢出最先进入队列(最后一个执行)的任务 实现RejectedExecutionHandler...意思是队列里的线程可以等待1s,超过了的需要新开线程来执行 切记不能设置为Integer.MAX_VALUE,这样队列会很大,线程数只会保持corePoolSize大小,当任务陡增,不能新开线程来执行...所以为了保证不出现的错误,使用这个类型队列的时候,maximumPoolSize一般指定成Integer.MAX_VALUE,即无限大 LinkedBlockingQueue...线程池的拒绝策略默认AbortPolicy ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。...)方法的时候 就会一直阻塞,所以开发应该尽量使用带超时时间的get(); 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/137654.html原文链接:https

    27210

    juc系列-Executor框架

    工作队列可以有以下几种选择: (1).ArrayBlockingQueue:基于数组的有界阻塞队列 (2).LinkedBlockingQueue:基于链表的阻塞队列,可以不指定队列大小,默认Integer.MAX_VALUE...,直到达到线程池的最大数量,此时线程池的规模不再变化(如果某个线程发生Exception而结束,那么线程池会补充一个新的线程) newCachedThreadPool:创建一个可缓存的线程池,如果当前线程池中线程的个数超过了处理需求...,那么空闲线程将被回收,而当需要增加线程,则可以添加新的线程,线程池中个数不受限制(使用时格外注意,防止内存溢出) newSingleThreadPool:这是一个单线程的Executor,它创建单个工作线程来执行任务...---- 注意事项 1.newFixedThreadPool和newSingleThreadExecutor都是用了LinkedBlockingQueue(),默认capacity=Integer.MAX_VALUE...还提供了以下几个钩子函数用于扩展它的行为,我们可以子类实现自己的逻辑,每个任务执行的前、后以及worker退出进行定制处理。

    37111

    Java 多线程与线程池 Thread弊端与Executor存在问题 及解决方法

    Java可以通过线程池来达到这样的效果。 什么时候使用线程池? 单个任务处理时间比较短 需要处理的任务数量很大 使用线程池的好处: 降低资源消耗。...Executor存在问题 阿里巴巴Java开发手册明确指出,不允许使用Executors创建线程池。 ?...其实,在上面的报错信息,我们是可以看出蛛丝马迹的,以上的代码其实已经说了,真正的导致OOM的其实是LinkedBlockingQueue.offer方法。...而newFixedThreadPool创建LinkedBlockingQueue,并未指定容量。...但是异常(Exception)总比发生错误(Error)要好。 除了自己定义ThreadPoolExecutor外。还有其他方法。这个时候第一间就应该想到开源类库,如apache和guava等。

    1.8K40

    Java的线程池用过吧?来说说你是怎么理解线程池吧?

    前言 Java的线程池用过吧?来说说你是怎么使用线程池的?这句话面试过程遇到过好几次了。我甚至这次标题都想写成【Java八股文之线程池】,但是有点太俗套了。...这一版的线程池,做到了提交任务高峰可临时扩容,低谷又可及时回收非核心线程,从而节省资源。真正的做到了收放自如。 通过上面几版线程池的改进,最终改进成了和Java的线程池原理基本相似了。...所以当任务提交量高峰,相当于无限制的创建线程。并且空闲时间是60秒,QPS高峰期最终会将服务器资源耗尽,所以真正实际应用不建议使用。...当不能在处理提交的任务,直接抛出RejectedExecutionException使用者可以自行捕获此异常。...优先级队列,将会导致优先级最高的任务被抛弃,所以阻塞队列为PriorityBlockingQueue,不建议使用此策略。

    50430

    003. 线程池应用及实现原理剖析

    为什么使用线程池?线程池是不是越多越好? ---- 线程 java 是一个对象,更是操作系统的资源,线程创建、销毁需要时间。如果创建时间+销毁时间>执行任务时间就很不合算了。...工作线程:线程池中线程,没有任务处于等待状态,可以循环地执行任务。...当唯一的线程因任务异常中止,将创建一个新的线程来继续执行后续的任务。...与 newFixedThreadPool(1) 的却别在于,单一线程池的池大小 newSingleThreadExecutor 方法硬编码,不能再改变的。...使用 SynchronousQueue 作为工作队列的前提下,客户端代码向线程池提交任务, 而线程又没有空闲的线程能够从 SynchronousQueue 队列取出一个任务

    22620

    java并发线程池---了解ThreadPoolExecutor就够了

    线程池-intsmaze 线程池的思想是:系统开辟一块区域,其中存放一些待命的线程,这个区域被称为线程池。...拒绝策略-intsmaze 线程池中的线程用完了,同时等待队列的任务已经塞满了,再也塞不下新任务了,就需要拒绝策略:处理任务数量超过系统实际承受能力,处理方式。...()); } newSingleThreadExecutor-intsmaze 任务队列LinkedBlockingQueue(长度无限),线程数量和最大线程数量均为1。...关闭线程池(很少使用,除了切换数据源需要控制)-intsmaze 希望程序执行完所有任务后退出,调用ExecutorService接口中的shutdown(),shutdownNow()方法。...《java并发编程实践》一书中给出了一个估算线程池大小的经验公式: Ncpu=CPU的数量 Ucpu=目标CPU的使用率,0<=Ucpu<=1 W/C=等待时间与计算时间的比率 为保持处理器达到期望的使用

    2.7K10

    蚂蚁金服SOFARegistry 之 自动调节间隔周期性任务

    ; ScheduledExecutorService 实现了周期性任务; TimedSupervisorTask 实现了自动调节间隔的周期性任务; 我们设计延时/周期性任务就可以参考TimedSupervisorTask...LinkedBlockingQueue不同于ArrayBlockingQueue,它如果不指定容量,默认为Integer.MAX_VALUE,也就是无界队列。...如果存在添加速度大于删除速度时候,有可能会内存溢出,所以为了避免队列过大造成机器负载或者内存爆满的情况出现,我们使用的时候建议手动传一个队列的大小。...数据是配对的生产者和消费者线程之间直接传递的,并不会将数据缓冲数据到队列。可以这样来理解:生产者和消费者互相等待对方,握手,然后一起离开。...,然后改变任务的延时时间timeoutMillis; 发生RejectedExecutionException异常,SOFA只是打印log。

    55910
    领券