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("任务被拒绝,记录日志 + 告警");
    }
}
相关推荐
三品吉他手会点灯1 分钟前
C语言学习笔记 - 27.C编程预备计算机专业知识 - 什么是字节
c语言·开发语言·笔记·学习
许彰午3 分钟前
政务远程帮办部署踩坑实录——从互联网到政务外网
开发语言·网络·政务
极客先躯32 分钟前
高级java每日一道面试题-2025年12月09日-实战篇[Docker]-如何配置 Docker 的日志驱动?有哪些日志驱动可选?
java·docker·日志驱动的作用与配置层级·日志驱动全览与对比·日志驱动配置的要点·日志标签定制·容器与宿主机时间戳
rabbit_pro1 小时前
Spring AI使用Ollama
java·人工智能·spring
Mike117.1 小时前
GBase 8a 物化视图依赖和 DDL 风险排查记录
java·服务器·前端
李少兄1 小时前
领域驱动设计与 Clean Code 的实践
java·数据库·领域驱动
存在的五月雨1 小时前
项目中 Vitest 配置详解:vitest.config.ts
开发语言·javascript·vue.js
野犬寒鸦1 小时前
Claude Code:终端AI编程助手全指南(附带指令全讲解)
开发语言·后端·面试·ai编程
淡笑沐白1 小时前
JavaScript零基础到精通
开发语言·javascript·ecmascript