返回

JUC 线程池:概念、功能和源码解读

后端

在计算机科学领域,线程池是一种旨在优化多线程应用程序性能的机制。Java 并发实用(JUC)包提供了强大的线程池实现,它抽象了线程管理的复杂性,简化了应用程序的开发和维护。

概念

线程池本质上是一个由管理线程集合的容器。当一个应用程序需要执行一项任务时,它可以向线程池提交任务。线程池负责管理任务的调度、执行和回收线程。这样可以避免频繁创建和销毁线程的开销,从而提高应用程序的性能和可伸缩性。

功能

JUC 线程池提供了一系列丰富的功能,包括:

  • 线程重用: 线程在执行完任务后不会立即销毁,而是返回到线程池中,以便稍后执行其他任务。
  • 任务队列: 当线程池中的所有线程都处于繁忙状态时,提交的任务将被排队等待执行。
  • 线程池大小调整: 线程池的大小可以根据应用程序的负载动态调整,以优化性能。
  • 拒绝策略: 当线程池已满时,可以指定拒绝策略来处理新任务。

源码解读

为了深入理解 JUC 线程池的内部机制,我们来看一下 ThreadPoolExecutor 类的简化源码:

public class ThreadPoolExecutor extends AbstractExecutorService {

    private final BlockingQueue<Runnable> workQueue;
    private final int corePoolSize;
    private final int maximumPoolSize;
    private final long keepAliveTime;

    public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue) {
        this.corePoolSize = corePoolSize;
        this.maximumPoolSize = maximumPoolSize;
        this.keepAliveTime = keepAliveTime;
        this.workQueue = workQueue;
    }

    // ... 省略其他方法 ...
}
  • workQueue:保存等待执行的任务。
  • corePoolSize:线程池的核心线程数,这些线程总是活动的。
  • maximumPoolSize:线程池的最大线程数,当任务队列已满时,线程池将创建新线程直至达到此限制。
  • keepAliveTime:非核心线程的空闲超时时间,在此时间后,空闲线程将被回收。

使用 JUC 线程池

使用 JUC 线程池非常简单。以下是一个示例代码:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class ThreadPoolExample {

    public static void main(String[] args) {
        // 创建一个具有 10 个核心线程的线程池
        ExecutorService executorService = Executors.newFixedThreadPool(10);

        // 提交任务到线程池
        for (int i = 0; i < 100; i++) {
            executorService.submit(() -> {
                // 这里执行任务
            });
        }

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