返回
JUC 线程池:概念、功能和源码解读
后端
2023-09-12 23:29:54
在计算机科学领域,线程池是一种旨在优化多线程应用程序性能的机制。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();
}
}