java线程的六种状态以及转换

1.双向箭头:状态可以互相转换;单向箭头:状态只能单向转换;

2.NEW:创建java线程初始对象,线程还未运行起来,调用start方法会变成RUNNABLE状态;

3.RUNNABLE:运行中,可运行,阻塞(操作系统);

4.WAITING:等待状态;t线程调用synchronized(obj)获取了对象锁前提下

(1)线2:调用wait,notify,notifyAll,interrupt可以和RUNNABLE相互转换;以上都是基于synchronized重量级锁(悲观锁)的情况下;唤醒后,竞争成功:WAITING --> RUNNABLE,竞争失败:WAITING --> BLOCKED;

(2)线3:调用t.join,使调用线程进入t线程对象的monitor监视器上等待,当前线程从RUNNABLE --> WAITING;t线程结束,或者当前线程调用interrupt,当前线程从WAITING --> RUNNALBE;

(3)线4:当前线程调用LockSupport.park(),当前线程从RUNNABLE --> WAITING;当前线程调用了LockSupport.unpark()或者interrupt,当前线程从WAITING --> RUNNABLE;

5.TIMED_WAITING:有时限的等待;t线程调用synchronized(obj)获取了对象锁前提下

(1)线5:当前线程调用obj.wait(long n),t线程从RUNNABLE --> TIMED_WAITING;t线程等待时间超过了n毫秒时,或者调用了notify,notifyAll,interrupt时,竞争成功:TIMED_WAITING --> RUNNABLE;竞争失败:TIMED_WAITING --> BLOCKED;

(2)线6:当前线程调用join(long n),当前线程从RUNNABLE --> TIMED_WAITING;当前线程等待超过了n毫秒,或运行结束,或者调用interrupt时,TIMED_WAITING --> RUNNABLE;

(3)线7:当前线程调用sleep(long n)时,当前线程从RUNNABLE --> TIMED_WAITING;当等待时间超过n毫秒时,TIMED_WAITING --> RUNNABLE;

(4)线8:当前线程调用LockSupport.parknanos(long nanos)或LockSupport.parkUntil(long millis)时,当前线程从RUNNABLE --> TIMED_WAITING;当调用了LockSupport.unpark(目标线程),interrupt或等待超时,TIMED_WAITING --> RUNNABLE;

6.BLOCKED:阻塞状态,t线程执行synchronized(obj)获取对象锁失败,RUNNABLE --> BLOCKED;持有obj锁线程的同步代码块执行完毕,唤醒obj对象上的所有BLOCKED的线程重新竞争,如果t线程成功,BLOCKED --> RUNNABLE;其他失败线程依然BLOCKED;

7.TEMINATED:当前线程所有代码执行完毕;

猜你喜欢

转载自blog.csdn.net/weixin_44182586/article/details/108984739