Java中的线程池(ThreadPoolExecutor)是并发编程中非常重要的工具,用于管理和复用线程,避免频繁创建和销毁线程带来的性能开销。Java通过java.util.concurrent包提供了丰富的线程池实现。
以下是关于Java线程池的详细介绍和使用方法:
1. 线程池的核心概念
线程池:维护一组线程,用于执行任务。
任务队列:用于存放待执行的任务。
线程工厂:用于创建线程。
拒绝策略:当任务队列已满且线程池达到最大线程数时,如何处理新任务。
2. 线程池的核心类
ExecutorService:线程池的接口,定义了线程池的基本行为。
ThreadPoolExecutor:线程池的核心实现类。
Executors:工具类,提供了创建线程池的工厂方法。
3. 线程池的创建
Java提供了几种常见的线程池创建方式,通过Executors工具类可以快速创建:
(1) 固定大小的线程池
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
特点:线程池中的线程数量固定。
适用场景:适合负载较重的服务器,保证线程数可控。
(2) 缓存线程池
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
特点:线程池中的线程数量不固定,根据任务数量动态调整。
适用场景:适合执行大量短期异步任务。
(3) 单线程线程池
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
特点:线程池中只有一个线程。
适用场景:适合需要保证任务顺序执行的场景。
(4) 定时任务线程池
ScheduledExecutorService scheduledThreadPool = Executors.newScheduledThreadPool(3);
特点:支持定时或周期性执行任务。
适用场景:适合需要定时执行任务的场景。
4. 自定义线程池
如果需要更精细地控制线程池的行为,可以直接使用ThreadPoolExecutor构造函数:
int corePoolSize = 5; // 核心线程数
int maxPoolSize = 10; // 最大线程数
long keepAliveTime = 60