侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

简述Java线程池的创建及核心参数

2025-12-13 / 0 评论 / 4 阅读

题目

简述Java线程池的创建及核心参数

信息

  • 类型:问答
  • 难度:⭐

考点

线程池创建,核心参数理解,线程池作用

快速回答

Java线程池通过ThreadPoolExecutor创建,核心参数包括:

  • corePoolSize:核心线程数
  • maximumPoolSize:最大线程数
  • keepAliveTime:非核心线程空闲存活时间
  • workQueue:任务队列
  • threadFactory:线程工厂
  • handler:拒绝策略

作用:复用线程资源,控制并发开销。

解析

1. 原理说明

线程池通过复用已创建的线程执行任务,避免频繁创建/销毁线程的开销。核心工作流程:

  1. 提交任务时,优先使用核心线程执行
  2. 核心线程满载后,任务进入工作队列
  3. 队列满时创建非核心线程(不超过maxPoolSize)
  4. 线程和队列均满时触发拒绝策略

2. 代码示例

import java.util.concurrent.*;

public class ThreadPoolExample {
    public static void main(String[] args) {
        // 创建线程池
        ThreadPoolExecutor executor = new ThreadPoolExecutor(
            2,   // corePoolSize
            5,   // maximumPoolSize
            30,  // keepAliveTime(秒)
            TimeUnit.SECONDS,
            new ArrayBlockingQueue<>(10), // 任务队列
            Executors.defaultThreadFactory(),
            new ThreadPoolExecutor.AbortPolicy() // 拒绝策略
        );

        // 提交任务
        executor.execute(() -> System.out.println("任务执行中..."));

        // 关闭线程池
        executor.shutdown();
    }
}

3. 核心参数详解

参数说明典型值
corePoolSize常驻核心线程数,即使空闲也不会销毁CPU密集型:N+1(N=CPU核心数)
maximumPoolSize线程池最大线程数IO密集型:2N+1
keepAliveTime非核心线程空闲存活时间30-60秒
workQueue任务队列,常用实现:
ArrayBlockingQueue(有界)、LinkedBlockingQueue(无界)
根据业务需求设定
handler拒绝策略,常用:
AbortPolicy(抛异常)、CallerRunsPolicy(调用者线程执行)
需根据场景选择

4. 最佳实践

  • 使用ThreadPoolExecutor而非Executors工厂方法,避免无界队列导致OOM
  • IO密集型任务:增大线程数(如maxPoolSize=50)
  • CPU密集型任务:线程数≈CPU核心数
  • 务必调用shutdown()关闭线程池

5. 常见错误

  • ❌ 使用Executors.newFixedThreadPool()创建无界队列线程池(可能导致OOM)
  • ❌ 忽略拒绝策略,默认AbortPolicy可能使任务丢失
  • ❌ 混淆corePoolSizemaxPoolSize导致线程创建逻辑错误

6. 扩展知识

  • 预定义线程池Executors.newCachedThreadPool()(可扩容线程池)、newSingleThreadExecutor()(单线程池)
  • 线程池状态:RUNNING、SHUTDOWN、STOP、TIDYING、TERMINATED
  • 监控:通过getActiveCount()getQueue().size()监控线程池状态