线程池核心原理及使用

java 线程池的核心参数有哪些?各自的作用是什么?

复制代码
public ThreadPoolExecutor(
    int corePoolSize,        // 核心线程数(常驻线程数,即使空闲也不会销毁)
    int maximumPoolSize,     // 最大线程数(线程池允许创建的最大线程数)
    long keepAliveTime,      // 非核心线程空闲超时时间(超时后销毁)
    TimeUnit unit,           // keepAliveTime 的时间单位
    BlockingQueue<Runnable> workQueue, // 任务阻塞队列(核心线程满后,任务入队等待)
    ThreadFactory threadFactory,       // 线程创建工厂(自定义线程命名、优先级等)
    RejectedExecutionHandler handler   // 拒绝策略(队列满+最大线程数满时,处理新任务的策略)
)
  • 阻塞队列:缓冲任务,避免线程创建 / 销毁过于频繁;同时实现「核心线程满 → 入队 → 扩容非核心线程」的流程控制
    • ArrayBlockingQueue(有界数组):推荐生产使用(避免无界队列 OOM);
    • LinkedBlockingQueue(无界链表):Executors 默认使用,易 OOM;
    • SynchronousQueue(同步队列):CachedThreadPool 使用,无存储能力,任务直接交给线程执行
  • 拒绝策略:
    • AbortPolicy(默认):直接抛出 RejectedExecutionException,中断任务提交;
    • CallerRunsPolicy:由提交任务的线程(如主线程)执行任务,降低任务提交速度;
    • DiscardPolicy:静默丢弃新任务,无任何提示;
    • DiscardOldestPolicy:丢弃队列中最旧的任务,尝试提交新任务。(生产中常自定义拒绝策略,如记录日志、异步写入消息队列重试)

执行过程

  1. 当提交任务时,若当前线程数 < 核心线程数(corePoolSize),直接创建核心线程执行任务;

  2. 若当前线程数 ≥ 核心线程数,判断阻塞队列是否已满:

  • 队列未满:将任务放入队列等待执行;

  • 队列已满:判断当前线程数是否 < 最大线程数(maximumPoolSize):

✅ 是:创建非核心线程执行任务;

❌ 否:触发拒绝策略处理任务。

  1. 非核心线程执行完任务后,空闲时间达到 keepAliveTime 则被销毁,线程数回落至 corePoolSize。

线程池类型

FixedThreadPool固定线程池

特点:

  • 线程数固定,任务排队执行,不会创建临时线程;
  • 无界队列可能导致任务堆积,最终 OOM(内存溢出)

适用场景:任务量稳定、需要控制并发数的场景(如服务器接口处理)

java 复制代码
CountDownLatch countDownLatch = new CountDownLatch(7);
ExecutorService executorService = Executors.newFixedThreadPool(7);

CachedThreadPool缓冲线程池

特点:

  • 任务来时直接创建新线程,空闲线程 60 秒销毁;
  • 同步队列无任务堆积,但线程数无上限可能导致创建大量线程,最终 OOM

适用场景:短期、高频、耗时短的任务(如临时批量处理小任务)

java 复制代码
final Semaphore semaphore = new Semaphore(2);
final ExecutorService fixedThread = Executors.newCachedThreadPool();

自定义线程池

java 复制代码
@Configuration
public class ThreadPoolFactory {
    @Bean(name = "openThreadPoll", destroyMethod = "shutdown")
    public ExecutorService openInvoiceThreadPoll() {
        final int corePoolSize = 10;
        final int maximumPoolSize = 10;
        final long keepAliveTime = 0;
        final TimeUnit keepAliveTimeUnit = TimeUnit.SECONDS;
        return new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, keepAliveTimeUnit,
                new LinkedBlockingQueue<Runnable>(), new NamedThreadFactory("openInvoiceThreadPoll"),
                new ThreadPoolExecutor.CallerRunsPolicy()) ;
    }
 }

@Autowired
private ExecutorService openThreadPoll;

openThreadPoll.submit(() -> {
	logiInterface(entity,"aaa","bbb,"ccc,"0");
});

其他

并发和并行的区别?

  • 并发:单核CPU同一时间段内交替执行多个任务
  • 并发:多核CPU同一时间同时执行多个任务
相关推荐
蛋蛋的就会顺顺的7 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
需要8268 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
小 黄 鸡8 小时前
HashMap 面试必会知识点详解(JDK 8)
java·面试·职场和发展
死磕音视频9 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
伯恩bourne10 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
silvamux_10 小时前
curl 测试 OpenAI 兼容 API 的完整流程
java·人工智能·缓存·ai·oneapi
省钱兄--zs11 小时前
深圳24小时自助健身房软硬件解决方案实战指南与开发流程详解
java·数据仓库·spring boot·小程序·架构
顽疲11 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog11 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
用户212968352616811 小时前
开源了一个 Java 多智能体 LLM 框架 Baton:一个依赖,把 Agent 循环、工具调用、记忆、编排全配齐
java·llm