线程的生命周期
线程状态 | 含义 | 说明 |
---|---|---|
NEW | 新建 | 还未调用start方法,还是活着的alive |
RUNNABLE | 准备就绪 | 调用了start方法,此时线程已经准备好,处于就绪队队列中,alive |
RUNING | 运行中 | 线程获得CPU资源,正在执行alive(其实不是真实存在这个状态) |
BLOCKED | 阻塞 | 线程阻塞与锁或者调用了sleep,alive |
WATING | 等待中 | 线程由于某个原因等待其他线程(join),alive |
TIME_WATING | 超时等待 | 与wating不同的是可以在特定的时间后自动返回,alive |
TERMINATEND | 终止 | 执行完毕或者被其他线程杀死,no alive |
三个让线程进入WATING状态的方法:
Object.wait
Thread.join
LockSupport.park()
Lock.lock()
sleep、wait、join区别
1. Thread.sleep()
- 使当前所在线程进入阻塞
- 只是让出CPU,并没有释放锁
- 由于睡眠时间结束后不一定立即被CPU调度,因此线程休眠的时间可能大于传入的参数
- 如果被终端则抛出
InterruptedException
2. Object.wait()
- 让出CPU,释放对象锁
- 在调用前需要先拥有对象锁,所以一般在synchronized中同步块使用
- 使该线程进入该对象的监视器的等待队列
3. Thread.join()
join=synchronized+Object.wait();
- 线程合并,调用线程会进入阻塞状态,需要等待被调用线程结束后才可以执行
- 应用场景:当一个线程必须等待其他线程执行完毕才能继续执行