Bootstrap

【Java】多线程篇 —— 线程池

线程池

线程池的核心类

Java 线程池的实现基于 java.util.concurrent 包,核心类和接口如下:

类/接口 说明
Executor 最基础的线程池接口,仅定义 execute(Runnable) 方法。
ExecutorService 扩展了 Executor,提供更丰富的线程池管理功能(如任务提交、关闭)。
ThreadPoolExecutor 线程池的核心实现类,所有功能均通过此类实现。
ScheduledExecutorService 支持定时任务和周期性任务的线程池接口。
Executors 工厂类,提供快捷创建线程池的静态方法(如 newFixedThreadPool)。

ThreadPoolExecutor 的构造方法

ThreadPoolExecutor 的构造函数包含7个参数,以下是详细说明:

public ThreadPoolExecutor(
    int corePoolSize,           // 核心线程数
    int maximumPoolSize,        // 最大线程数
    long keepAliveTime,         // 临时线程的空闲存活时间
    TimeUnit unit,              // 时间单位(秒、毫秒等)
    BlockingQueue<Runnable> workQueue, // 任务队列
    ThreadFactory threadFactory,       // 线程工厂(自定义线程创建)
    RejectedExecutionHandler handler   // 拒绝策略
)

参数详解

  1. corePoolSize
    • 作用:线程池中始终保持存活的线程数量(即使空闲也不会被回收)。
    • 示例:若设置为3,线程池最少有3个线程处理任务。
  2. maximumPoolSize
    • 作用:线程池允许创建的最大线程数(包括核心线程和临时线程)。
    • 示例:若设置为10,当任务队列满时,最多创建10个线程。
  3. keepAliveTime + unit
    • 作用:临时线程(超出核心线程数的线程)的空闲存活时间。超过该时间且无任务执行时,临时线程会被回收。
    • 示例60, TimeUnit.SECONDS 表示临时线程空闲60秒后终止。
  4. workQueue
    • 作用:存储待执行任务的队列。
    • 常用实现类
      • ArrayBlockingQueue:有界队列(需指定容量)。
      • LinkedBlockingQueue:无界队列(默认容量为 Integer.MAX_VALUE)。
      • SynchronousQueue:直接传递任务的队列(无存储能力)。
  5. threadFactory
    • 作用:自定义线程的创建方式(如设置线程名称、优先级)。
    • 默认实现Executors.defaultThreadFactory()
  6. handler
    • 作用:当任务队列已满且线程数达到最大值时的拒绝策略。
    • 内置策略
      • AbortPolicy(默认):抛出 RejectedExecutionException 异常。
      • CallerRunsPolicy:由提交任务的线程直接执行任务。
      • DiscardPolicy:静默丢弃新任务。
      • DiscardOldestPolicy:丢弃队列中最旧的任务,然后重新提交新任务。

线程池的常用方法

提交任务

方法 说明
void execute(Runnable task) 提交一个无需返回值的任务(适合异步执行)。
Future<T> submit(Callable<T> task) 提交一个有返回值的任务,通过 Future 获取结果或异常。
Future<?> submit(Runnable task) 提交 Runnable 任务,返回的 Future 可用于判断任务是否完成。

示例

ExecutorService executor = Executors.newFixedThreadPool(3);

// 使用 execute 提交任务(无返回值)
executor.execute(() -> 
;