重新理解线程状态转换
文章目录
1.线程状态转换
2.不同过程分析
情况1:NEW–>RUNNABLE
创建线程对象
时,线程t的状态是NEW
当调用t.start()
时,线程状态由NEW-->RUNNABLE
情况2:RUNNABLE<–>WAITING
t线程调用synchronized(obj)
后,
调用 obj.wait()
时,t线程从RUNNABLE-->WAITING
调用 obj.notify()
,obj.notifyAll()
,t.interrupt()
时:
- 如果
竞争成功
,t线程从WAITING-->RUNNABLE
- 如果
竞争失败
,t线程从WAITING-->BLOCKED
(进入阻塞队列EntryList),等待调度器。
情况3:RUNNABLE<–>WAITING
当前线程调用t.join()
后,当前线程从RUNNABLE-->WAITING
注意:当前线程在t线程对象的监视器上等待
t线程结束
,或者调用了当前线程的interrupt()
时,当前线程从WAITING-->RUNNABLE
情况4:RUNNABLE<–>WAITING
当前线程调用LockSupport.park()
,会让当前线程从RUNNABLE-->WAITING
调用了线程的LockSupport.unpark(目标线程)
,或者调用了目标线程的interrupt()
方法,会让目标线程从WAITING-->RUNNABLE
情况5:RUNNABLE<–>TIMED_WAITING
t线程调用synchronized(obj)
获取了对象锁后:
调用了obj.wait(long n)
后,t线程从RUNNABLE-->TIMED-WAITING
t线程等待了n毫秒后
,或者调用了obj.notify()
,obj.notifyAll()
,t.interrupt()
时:
- 如果竞争成功,t线程从
TIMED_WAITING-->RUNNABLE
- 如果竞争失败,t线程从
TIMED_WAITING-->BLOCKED
(进入阻塞队列EntryList),等待调度器。
情况6:RUNNABLE<–>TIMED_WAITING
当前线程调用t.join(long n)
,当前线程从RUNNABLE<-->TIMED_WAITING
- 注意:当前线程在t线程的监视器上等待。
当前线程等待了n毫秒
或者t线程结束
,或者调用了当前线程的interrupt()
时,当前线程从TIMED_WAITING-->RUNNABLE
情况7:RUNNABLE<–>TIMED_WAITING
当前线程调用了Threads.sleep(long n);
当前线程从RUNNABLE-->TIMED_WAITING
当前线程等待时间超过了n毫秒
,当前线程从TIMED_WAITING-->RUNNABLE
情况8:RUNNABLE<–>TIMED_WAITING
当前线程调用 LockSupport.parkNanos(long nanos)
或LockSupport.parkUntil(long millis)
时,当前线程从 RUNNABLE --> TIMED_WAITING
调用LockSupport.unpark(目标线程)
或调用了线程 的 interrupt()
,或是等待超时
,会让目标线程从TIMED_WAITING--> RUNNABLE
情况9:RUNNABLE<–>BLOCKED (与RUNNABLE<–>WAITING区别!)
t 线程用 synchronized(obj)
获取了对象锁时如果竞争失败,从 RUNNABLE --> BLOCKED
持 obj 锁线程的同步代码块执行完毕
,会唤醒该对象上所有 BLOCKED 的线程重新竞争
,如果其中t 线程竞争成功
,从BLOCKED --> RUNNABLE
,其它失败的线程仍然 BLOCKED
情况10:RUNNABLE <–> TERMINATED
当前线程所有代码运行完毕
,进入 TERMINATED