Java线程池基础概念
Java线程池是一种多线程处理形式,处理过程中将任务添加到队列,在创建后自动启动线程。线程池中的线程可以重复使用,减少频繁创建和销毁线程的开销。
线程池核心参数
- corePoolSize:线程池核心线程数,即使空闲也会保留的线程数量。
- maximumPoolSize:线程池最大线程数,允许创建的最大线程数量。
- keepAliveTime:非核心线程空闲存活时间,超过该时间会被销毁。
- workQueue:用于保存待执行任务的阻塞队列。
- threadFactory:用于创建新线程的工厂。
- handler:拒绝策略,当线程池和队列都满时的处理方式。
线程池创建示例
ThreadPoolExecutor
是常用的线程池实现类,以下是创建线程池的代码示例:
import java.util.concurrent.*;
public class ThreadPoolExample {
public static void main(String[] args) {
// 创建线程池
ExecutorService executor = new ThreadPoolExecutor(
5, // 核心线程数
10, // 最大线程数
60L, // 空闲线程存活时间
TimeUnit.SECONDS, // 时间单位
new ArrayBlockingQueue<>(100), // 任务队列
Executors.defaultThreadFactory(), // 线程工厂
new ThreadPoolExecutor.AbortPolicy() // 拒绝策略
);
// 提交任务
for (int i = 0; i < 20; i++) {
final int taskId = i;
executor.execute(() -> {
System.out.println("执行任务: " + taskId + ", 线程: " + Thread.currentThread().getName());
});
}
// 关闭线程池
executor.shutdown();
}
}
Executors工具类
Java提供了Executors
工具类快速创建线程池:
newFixedThreadPool(int nThreads)
:固定大小线程池newCachedThreadPool()
:可缓存线程池newSingleThreadExecutor()
:单线程线程池newScheduledThreadPool(int corePoolSize)
:定时任务线程池
// 创建固定大小的线程池
ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
// 创建缓存线程池
ExecutorService cachedThreadPool = Executors.newCachedThreadPool();
// 创建单线程线程池
ExecutorService singleThreadExecutor = Executors.newSingleThreadExecutor();
线程池拒绝策略
当线程池和队列都满时,会触发拒绝策略:
AbortPolicy
:默认策略,抛出RejectedExecutionExceptionCallerRunsPolicy
:由调用线程处理该任务DiscardOldestPolicy
:丢弃队列中最老的任务并重试DiscardPolicy
:直接丢弃任务
线程池生命周期管理
shutdown()
:平缓关闭,不再接受新任务,已提交任务继续执行shutdownNow()
:立即关闭,尝试停止所有正在执行的任务isShutdown()
:判断线程池是否已关闭isTerminated()
:判断所有任务是否已完成
线程池最佳实践
避免使用无界队列,可能导致内存溢出 根据任务类型选择合适的线程池 合理设置线程池大小,考虑CPU核心数和任务特性 使用自定义ThreadFactory便于问题排查 正确处理线程池关闭,避免资源泄漏