首页
学习
活动
专区
工具
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/
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

多线程的使用,避免ExecutorService 的创建处理

如果读者对Java 中的阻塞队列有所了解的话,看到这里或许就能够明白原 因了。 Java 中的BlockingQueue 主要有两种实现, 分别是ArrayBlockingQueue 和 LinkedBlockingQueue。 ArrayBlockingQueue 是一个用数组实现的有界阻塞队列,必须设置容量。 LinkedBlockingQueue 是一个用链表实现的有界阻塞队列,容量可以选择 进行设置,不设置的话,将是一个无边界的阻塞队列,最大长度为Integer.MAX_ VALUE。 这里的问题就出在:不设置的话,将是一个无边界的阻塞队列,最大长度为 为什么阿里巴巴禁止使用Executors 创建线程池? <  35 Integer.MAX_VALUE。也就是说,如果我们不设置LinkedBlockingQueue 的 容量的话,其默认容量将会是Integer.MAX_VALUE。 而newFixedThreadPool 中创建LinkedBlockingQueue 时,并未指定容 量。此时,LinkedBlockingQueue 就是一个无边界队列,对于一个无边界队列 来说,是可以不断的向队列中加入任务的,这种情况下就有可能因为任务过多而导 致内存溢出问题。 上面提到的问题主要体现在newFixedThreadPool 和newSingleThreadExecutor 两个工厂方法上,并不是说newCachedThreadPool 和newScheduledThreadPool 这两个方法就安全了,这两种方式创建的最大线程数可能是 Integer.MAX_VALUE,而创建这么多线程,必然就有可能导致OOM。

08
  • 线程池参数设计技巧

    ThreadPoolExecutor线程池参数设置技巧 一、ThreadPoolExecutor的重要参数 corePoolSize:核心线程数 核心线程会一直存活,及时没有任务需要执行 当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处理 设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭 queueCapacity:任务队列容量(阻塞队列) 当核心线程数达到最大时,新任务会放在队列中排队等待执行 maxPoolSize:最大线程数 当线程数>=corePoolSize,且任务队列已满时。线程池会创建新线程来处理任务 当线程数=maxPoolSize,且任务队列已满时,线程池会拒绝处理任务而抛出异常 keepAliveTime:线程空闲时间 当线程空闲时间达到keepAliveTime时,线程会退出,直到线程数量=corePoolSize 如果allowCoreThreadTimeout=true,则会直到线程数量=0 allowCoreThreadTimeout:允许核心线程超时 rejectedExecutionHandler:任务拒绝处理器 两种情况会拒绝处理任务: 当线程数已经达到maxPoolSize,切队列已满,会拒绝新任务 当线程池被调用shutdown()后,会等待线程池里的任务执行完毕,再shutdown。如果在调用shutdown()和线程池真正shutdown之间提交任务,会拒绝新任务 线程池会调用rejectedExecutionHandler来处理这个任务。如果没有设置默认是AbortPolicy,会抛出异常 ThreadPoolExecutor类有几个内部实现类来处理这类情况: AbortPolicy 丢弃任务,抛运行时异常 CallerRunsPolicy 执行任务 DiscardPolicy 忽视,什么都不会发生 DiscardOldestPolicy 从队列中踢出最先进入队列(最后一个执行)的任务 实现RejectedExecutionHandler接口,可自定义处理器 二、ThreadPoolExecutor执行顺序: 线程池按以下行为执行任务

    01

    JAVA线程之线程池(七)

    1.不一定是越多越好,首先线程在java里面是一个对象,只要是对象肯定要占用一定的资源,更多的是操作系统保护的资源,线程的创建和销毁都需要时间和空间,如果线程的(创建时间+销毁时间)大于执行时间 就很不划算了。举个例子,创建时间1秒,销毁时间1秒,任务执行也就是1秒,这就没必要搞一个新的线程了,就考虑线程能否复用。 2.java对象占用堆内存,操作系统的线程也会占用内存,对象本身也会占用堆内存,根据JVM规范一个线程最大的栈是1M,达到最大了,栈空间就需要去系统内存中进行分配的,线程不管是占用了多少,只要线程一多,会消耗更多的内存。 3.多线程下操作系统在处理的时候,CPU时间片的增强就会有一个频繁的切换系统上下文,每个线程都想被运行,导致每个线程都执行的很慢,不能专心执行某一个线程。

    02
    领券