两个视角
操作系统层面:初始、可运行、运行、阻塞、终止
Java层面:NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED
线程状态变化
1.NEW ——> RUNNABLE 启动线程,如调用start()方法
JAVA中的RUNNABLE包含了可运行、运行、阻塞三种状态(此处的阻塞为操作系统层面的相关阻塞API,和BLOCKED无关)
2.RUNNABLE <——> WAITING
设t线程用synchronized(lock)获取了锁对象
- 调用lock.wait(),线程t从runnable状态变为waiting,调用lock.notify()、lock.notifyAll()、t.interrupt()时,线程t有两种可能:1、线程t竞争锁成功,状态由waiting变为runnable 2、竞争锁失败,由waiting变为blocked
- 当前线程调用t.join()时,当前线程状态从runnable变为waiting;t线程运行结束或当前线程调用了t.interrupt()时,当前线程从waiting变为runnable
- 当前线程调用LockSupport.park()方法时,当前线程状态从runnable变为waiting,调用LockSupport.unpark()或interrupt方法时,当前线程状态从waiting变为runnable
3.RUNNABLE <——>TIMED_WAITING
- 有时限的wait
- 有时限的join
- Thread.sleep(long n)
- LockSupport.parkNanos(long nanos)、 LockSupport.parkUntil(long millis)
4.RUNNABLE <——> BLOCKED
t线程如果用synchronized(lock)获取锁失败,就会进入blocked状态,当持有lock锁线程的同步代码块执行完后,就会唤醒所有在lock上等待的线程进行竞争,如果t线程竞争成功,则进入runnable状态,其他失败的线程依然blocked
5.RUNNABLE ——> TERMINATED
线程所有代码执行完毕,进入terminated状态
注:BLOCKED在IDEA Debugger中的名称是MONITOR