1. 线程池基础与核心概念
1.1 线程生命周期深度解析
在Java并发编程中,理解线程的生命周期是掌握线程池的基础。Java通过Thread.State枚举类明确定义了六种线程状态:
- NEW(新建):线程对象刚被创建但未调用start()
- RUNNABLE(就绪/运行):包括等待CPU分配时间片和正在执行两种子状态
- BLOCKED(阻塞):线程等待获取监视器锁(synchronized)
- WAITING(无限等待):通过Object.wait()进入,需notify()唤醒
- TIMED_WAITING(限时等待):通过Thread.sleep()或带超时的wait()进入
- TERMINATED(终止):线程执行完毕或异常退出
关键理解:RUNNABLE状态实际包含操作系统层面的"就绪"和"运行"两种状态,这是JVM对底层状态的抽象封装。
1.2 线程状态转换实战图解
通过实际代码演示状态转换:
java复制public class ThreadStateDemo {
public static void main(String[] args) throws InterruptedException {
Object lock = new Object();
Thread t1 = new Thread(() -> {
synchronized (lock) {
try {
lock.wait(1000); // TIMED_WAITING
Thread.sleep(500); // 再次TIMED_WAITING
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread t2 = new Thread(() -> {
synchronized (lock) {
System.out.println("t2获取到锁");
}
});
System.out.println(t1.getState()); // NEW
t1.start();
Thread.sleep(50);
System.out.println(t1.getState()); // TIMED_WAITING
t2.start();
Thread.sleep(50);
System.out.println(t2.getState()); // BLOCKED
synchronized (lock) {
lock.notifyAll();
}
Thread.sleep(100);
System.out.println(t1.getState()); // RUNNABLE或TERMINATED
}
}
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 线程池核心原理与实现
2.1 为什么需要线程池
直接创建线程的三大痛点:
- 创建销毁开销大:每次new Thread()涉及系统调用和资源分配
- 资源耗尽风险:无限制创建线程会导致OOM(OutOfMemoryError)
- 管理复杂度高:线程的生命周期管理需要开发者自行处理
线程池通过以下机制解决这些问题:
- 线程复用:保持核心线程常驻,避免频繁创建销
