08.Java线程
总结
- Java 线程六种状态:NEW/RUNNABLE/BLOCKED/WAITING/TIMED_WAITING/TERMINATED
- 阻塞 IO 在操作系统层面是阻塞,但 Java 层面仍是 RUNNABLE
- 终止线程用
interrupt(),不用stop();CPU 密集型线程数 ≈ 核数+1,IO 密集型按公式算
1. 线程生命周期
Java 六种状态
| 状态 | 触发条件 |
|---|---|
| NEW | new Thread() 后,未调用 start() |
| RUNNABLE | 调用 start(),包含操作系统的运行+就绪 |
| BLOCKED | 等待 synchronized 隐式锁 |
| WAITING | Object.wait()、Thread.join()、LockSupport.park() |
| TIMED_WAITING | 上述方法的带超时版本,以及 Thread.sleep(millis) |
| TERMINATED | run 方法执行完或抛异常 |
![]() |
注意:线程调用阻塞 IO(如读文件、网络),在操作系统层面是阻塞,但 Java 层面仍是 RUNNABLE。
2. 创建线程的两种方式
// 方式一:继承 Thread
class MyThread extends Thread {
public void run() { /* ... */ }
}
// 方式二:实现 Runnable(推荐,解耦任务与线程)
Thread t = new Thread(() -> { /* ... */ });
t.start();
实际开发中线程都交给 线程池 管理,很少手动 new Thread。
3. 终止线程
stop():不推荐,直接杀死线程,可能导致资源未释放(内存泄漏)interrupt():推荐,仅发送通知,线程自己决定何时退出- 收到通知的方式:抛出
InterruptedException或主动检测Thread.isInterrupted()
- 收到通知的方式:抛出
4. 线程数设置
- CPU 密集型:线程数 = CPU 核数 + 1
- IO 密集型:线程数 =
CPU核数 × (1 + IO耗时/CPU耗时)
线程本地存储见 11.ThreadLocal。
