线程池队列满时,任务提交会怎样?


💖The Begin💖点点关注,收藏不迷路💖

在Java的ThreadPoolExecutor中,当线程池的任务队列已满且无法创建更多线程以处理新任务时,情况会如何?

1、答案

当线程池达到其处理能力的极限时,会抛出RejectedExecutionException异常,而不是让提交任务的线程阻塞等待。

2、队列已满时的行为

  • 队列满:线程池的任务队列达到容量上限。
  • 无法增加线程:线程数已达到最大线程数(maximumPoolSize)。
  • 拒绝策略:此时,会根据配置的拒绝策略来处理新任务,默认策略是抛出RejectedExecutionException

3、应对方案

1、选择合适的拒绝策略:根据应用需求选择合适的拒绝策略,**

  • AbortPolicy(默认)

    • 行为:直接抛出RejectedExecutionException异常。
    • 说明:这是默认的拒绝策略,当任务无法被执行时,会立即通知调用者。
  • CallerRunsPolicy

    • 行为:由调用者线程(即提交任务的线程)来执行该任务。
    • 说明:如果线程池已满,新任务将由提交它的线程执行,这有助于避免新任务被丢弃。
  • DiscardPolicy

    • 行为:静默丢弃无法处理的任务,不抛出异常。
    • 说明:该策略不会给调用者任何反馈,任务将被简单地忽略。
  • DiscardOldestPolicy

    • 行为:丢弃队列中最老的一个任务,并执行当前任务。
    • 说明:这种策略会尝试为新的任务腾出空间,通过移除队列中最先等待的任务来实现。

2、监控和调整:通过监控线程池的状态,及时调整线程池的配置,以应对不同的负载情况。**

3、线程池(ThreadPoolExecutor)的工作原理

ThreadPoolExecutor 的工作原理可以概括为以下几个步骤:

3.1 提交任务

  • 方法:通过 execute()submit() 方法向线程池提交任务。
  • 描述:这两个方法都用于向线程池提交需要执行的任务。

3.2 任务队列

  • 条件:如果当前线程池中的线程数量少于核心线程数(corePoolSize)。
  • 行为:则创建新线程来执行任务。
  • 队列:如果线程数已达到核心线程数,则新任务会被放入队列中等待执行。

3.3 增加线程

  • 条件:如果任务队列已满,且线程池中的线程数小于最大线程数(maximumPoolSize)。
  • 行为:则创建新线程来处理任务,以充分利用系统资源。

3.4 拒绝任务

  • 条件:如果任务队列已满,且线程数已达到最大线程数。
  • 行为:此时再尝试提交任务,则会根据配置的拒绝策略(RejectedExecutionHandler)来处理。
  • 拒绝策略:包括直接抛出异常(AbortPolicy)、由调用者线程执行(CallerRunsPolicy)、静默丢弃(DiscardPolicy)或丢弃最老任务(DiscardOldestPolicy)等。

在这里插入图片描述


💖The End💖点点关注,收藏不迷路💖
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Seal^_^

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值