BLOCKED,WAITING,TIMED_WAITING的区别请看另外一篇帖子:https://blog.csdn.net/qq_41834553/article/details/112626166
1、NEW←→RUNNABLE
当调用t.start()方法时,会由NEW→RUNNABLE
2、RUNNABLE←→WAITING
当调用obj.wait()方法时,t线程会从RUNNABLE→WAITING
当调用obj.notify()/obj.notifyall()/t.interrupt()方法时:
1)竞争锁成功,t线程从WAITING→RUNNABLE
2)竞争锁失败,t线程从WAITING→BLOCKED
3、RUNNABLE←→WAITING
当前线程调用t.join()方法时,当前线程从RUNNABLE→WAITING
t线程运行结束或者调用了当前线程的interrupt()方法时,当前线程从WAITING→RUNNABLE(注意是哪个线程调用join方法,该线程等待目标线程对象)
4、RUNNABLE←→WAITING
当前线程调用LockSupport.park()方法时会让当前线程从RUNNABLE→WAITING
调用LockSupport.unpark()方法或者调用了线程的interrupt()方法,会让目标线程从WAITING→RUNNABLE
5、RUNNABLE←→TIMED_WAITING
t线程使用synchronized(obj)获取了对象锁以后
1)调用obj.wait(long n)方法时,t线程从RUNNABLE→TIMED_WAITING
2)t线程等待时间超过了n毫秒,或者调用了obj.notify(),obj.notifyall(),t.interrupt()时:
①竞争锁成功,t线程从TIMED_WAITING→RUNNABLE
②竞争锁失败,t线程从TIMED_WAITING→BLOCKED
6、RUNNABLE←→TIMED_WAITING
当前线程调用t.join(long n)方法时,当前线程从RUNNABLE→TIMED_WAITING
当前线程等待时间超过了n毫秒,当前线程从TIMED_WAITING→RUNNABLE
7、RUNNABLE←→TIMED_WAITING
当前线程调用了Thread.sleep(long n),当前线程从RUNNABLE→TIMED_WAITING
当前线程等待时间超过了n毫秒,当前线程从TIMED_WAITING→RUNNABLE
8、RUNNABLE←→TIMED_WAITING
当前线程调用LockSupport.parkNanos(long nanos)或LockSupport.parkNanos(long mills)时,当前线程从RUNNABLE→TIMED_WAITING
调用LockSupport.unpark(目标线程)或调用了线程的interrupt(),或是等待超时,会让目标线程从TIMED_WAITING→RUNNABLE
9、RUNNABLE←→BLOCKED
t线程使用synchronized(obj)获取对象锁时如果竞争失败,从RUNNABLE→BLOCKED
持obj锁线程的同步代码块执行完毕,会唤醒该对象上所有处于BLOCKED状态下的线程重新竞争,如果t线程竞争成功,它会从BLOCKED→RUNNABLE,其他竞争失败的线程的状态仍然是BLOCKED
10、RUNNABLE←→TERMINATED
当前线程所有代码运行完毕,进入TERMINATED
图片、内容归纳整理来源:https://www.bilibili.com/video/BV16J411h7Rd?p=281