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("任务被拒绝,记录日志 + 告警");
    }
}
相关推荐
SimonKing4 小时前
艹,维护AI写的代码,我心态崩了......
java·后端·程序员
用户298698530144 小时前
Java Word 文档样式进阶:段落与文本背景色设置完全指南
java·后端
小bo波20 小时前
从"任意文件复制"深挖Java I/O:字符流与字节流的本质抉择
java·nio·io流·后端开发·文件复制
nanxun8862 天前
记一次诡异的 Docker 容器"串包"故障排查
java
用户1563068103512 天前
Day01 | Java 基础(Java SE)
java
行者全栈架构师2 天前
Maven dependency:tree 的 8 个高级用法
java·后端
行者全栈架构师2 天前
IDEA 中 Maven 项目的 15 个红色报错快速解决方法
java·后端
令人头秃的代码0_02 天前
mac(m5)平台编译openjdk
java
唐青枫3 天前
Java JDBC 实战指南:从 Connection 到事务和连接池
java
一个做软件开发的牛马3 天前
MyBatis-Plus 从零实战:完整搭建可运行 Demo,BaseMapper 零 SQL、Wrapper 条件构造、分页插件与代码生成器详解
java·后端