
首先说明一下操作系统线程生命周期和Java线程生命周期的区别:
操作系统线程的5个状态:
- 新建:就是刚使用new方法,new出来的线程;
- 就绪:就是调用的线程的start()方法后,这时候线程处于等待CPU分配资源阶段,谁先抢的CPU资源,谁开始执行;
- 运行:当就绪的线程被调度并获得CPU资源时,便进入运行状态,run方法定义了线程的操作和功能;
- 阻塞:通过sleep或者锁进入阻塞状态,通过notify或者抢占到锁之后恢复就绪状态
- 终止:如果线程正常执行完毕后或线程被提前强制性的终止或出现异常导致结束,那么线程就要被销毁,释放资源;
Java线程的6个状态:
- New(初始化状态)(new Thread)
- Runnable(可运行/运行状态)(thread.start()进入可运行状态,等到cpu调度进入运行中)
- Blocked(阻塞状态)(Synchronized)
- Waiting(无时间限制的等待状态)(通过sleep、wait、join、LockSupport.park进入)(通过notify、notifyAll、LockSupport.unpark回到Runnable)
- Timed_Waiting(有时间限制的等待状态)(通过sleep(time)、wait(time)、join(time)、LockSupport.park(xx)进入)(通过notify、notifyAll、LockSupport.unpark回到Runnable)
- Terminated(终止状态)
重点:
- 创建线程后,不会立即开始执行,需要在就绪状态等待系统调用该线程
- Java中的三种阻塞(Blocked、Waiting、Timed_Waiting)均对应系统层面的阻塞状态
- Java中的Runnable对应系统层面的就绪+运行
- 运行状态的前置状态只有就绪,终止状态的前置状态只有运行