Java 线程池阻塞队列与拒绝策略

一、阻塞队列是什么?

阻塞队列就是线程池的 "候客区"。当核心线程全部忙碌,新进来的任务会进入队列等待。

Java 提供了多种阻塞队列,线程池最常用 4 种:

1. ArrayBlockingQueue

  • 基于数组实现
  • 有界队列
  • 必须指定容量
  • 生产环境最推荐

2. LinkedBlockingQueue

  • 基于链表
  • 可无界、可有界
  • 无界会导致任务无限堆积 → OOM

3. SynchronousQueue

  • 不存储元素
  • 直接移交任务
  • 任务量大容易疯狂创建线程

4. PriorityBlockingQueue

  • 支持优先级
  • 无界队列
  • 按优先级执行任务

二、生产环境队列选择原则

  1. 必须使用有界队列
  2. 优先选择 ArrayBlockingQueue
  3. 禁止使用无界队列
  4. 队列长度根据业务压力调整

三、拒绝策略详解

当队列满 + 线程数达到最大 → 触发拒绝策略。JDK 提供 4 种拒绝策略:

1. AbortPolicy(默认)

直接抛出 RejectedExecutionException。不建议生产使用,会导致任务丢失。

2. CallerRunsPolicy(生产最推荐)

任务回退到调用者线程执行。不丢任务、不崩溃、起到限流作用。

3. DiscardOldestPolicy

丢弃队列最老的任务,再尝试提交。

4. DiscardPolicy

直接丢弃任务,不抛异常。

四、生产环境拒绝策略选择

  • 高可靠业务:CallerRunsPolicy
  • 允许丢任务:DiscardPolicy
  • 测试环境:AbortPolicy
  • 特殊场景:自定义拒绝策略

五、自定义拒绝策略示例

复制代码
public class MyRejectPolicy implements RejectedExecutionHandler {
    @Override
    public void rejectedExecution(Runnable r, ThreadPoolExecutor e) {
        System.out.println("任务被拒绝,记录日志 + 告警");
    }
}
相关推荐
panxianren9 小时前
Bun 1.4 的 bun test --parallel 将 4 秒的测试套件缩短到约 1 秒
java·javascript
“AI国潮设计-小江”11 小时前
《Python+SDXL实战:用ControlNet精准控制“英歌舞翻糖吐司”构图,附批量生成脚本》
开发语言·人工智能·python·prompt·aigc
程序喵大人11 小时前
【C++入门】编译链接模型 - 01 一个 C++ 程序是怎样变成可执行文件的
开发语言·c++·编译链接模型
sunshine22 girl11 小时前
Java学习七 Java 项目实战2-注册业务
java·学习
省钱兄--zs11 小时前
北京24小时自助健身房系统软件开发实战:从架构设计到部署指南
java·数据仓库·spring boot·小程序·需求分析
youdexiang12 小时前
Android录音软件时间关键词检索功能分析
java·人工智能
sunshine22 girl12 小时前
Java学习七 Java 项目实战1-项目创建和主页面搭建
java·开发语言·学习
code2cat12 小时前
Java进阶篇之AtomicStampedReference:引用回到原值,版本戳仍能记住变化
java·cas·并发编程·aba
菜鸟~noob23313 小时前
【电子战】第三季预告—波武器与电子系统强力毁伤
开发语言·数据库·matlab·电子战
惊讶的猫14 小时前
工具选对之后还不够:商城 Agent 的参数与权限治理
开发语言·python