Java 线程池详解

Java 线程池详解
一、基本概念与核心参数

✅ ‌核心参数‌:

参数名 作用 示例值
corePoolSize 核心线程数,即使空闲也不会被回收的线程数量 5
maximumPoolSize 最大线程数,当队列满时允许创建的非核心线程数 10
keepAliveTime 非核心线程空闲时的存活时间 3(秒)
workQueue 任务队列,用于缓存待执行任务 ArrayBlockingQueue
handler 拒绝策略,当队列和线程池满时的处理逻辑 AbortPolicy

二、工作流程
提交任务‌:通过 execute() 或 submit() 提交任务‌。
核心线程分配‌:
若当前线程数 < 核心线程数,直接创建新线程执行任务‌。
若核心线程已满,任务进入队列等待‌。
非核心线程启用‌:
队列满且线程数 < 最大线程数时,创建临时线程处理任务‌。
拒绝策略触发‌:
队列和线程池均满时,执行拒绝策略(如抛出异常或丢弃任务)‌。
三、常见线程池类型
类型‌ ‌特点‌ ‌适用场景‌
FixedThreadPool 固定核心线程数 + 无界队列(可能导致内存溢出) 长期稳定并发任务
CachedThreadPool 无核心线程,最大线程数极大(Integer.MAX_VALUE) 短期高并发任务
SingleThreadExecutor 仅 1 个核心线程,保证任务顺序执行 串行化任务(如日志处理)
ScheduledThreadPool 支持定时/周期性任务(如心跳检测) 定时任务调度

四、Spring 集成线程池

  1. 配置示例(XML)
    xml
    Copy Code




  2. 使用注解
    java
    Copy Code
    @Async("taskExecutor")
    public void asyncTask() {
    // 异步任务逻辑
    }

五、最佳实践
避免无界队列‌:使用 ArrayBlockingQueue(有界队列)防止内存溢出‌。
自定义拒绝策略‌:
CallerRunsPolicy:由提交任务的线程直接执行任务‌。
DiscardOldestPolicy:丢弃队列中最旧任务并重试提交新任务‌。
监控工具‌:
getActiveCount():获取活跃线程数‌。
getQueue().size():查看队列积压任务数量‌。

posted @ 2025-03-11 13:04  shog808  阅读(42)  评论(0)    收藏  举报