多线程教程(十五)多线程的状态转换

一、多线程状态
多线程状态详细解析见之前的文章
二、线程状态之间的转换
每个序号代表途中所示的线程状态转换,本章节以java的线程状态(六种)进行介绍
- NEW –> RUNNABLE
- 当调用 t.start() 方法时,由 NEW --> RUNNABLE
- RUNNABLE <–> WAITING
t 线程用 synchronized(obj) 获取了对象锁后
-
调用 obj.wait() 方法时,t 线程从 RUNNABLE --> WAITING
-
调用 obj.notify() , obj.notifyAll() , t.interrupt() 时
- 竞争锁成功,t 线程从 WAITING --> RUNNABLE
- 竞争锁失败,t 线程从 WAITING --> BLOCKED
- RUNNABLE <–> WAITING
- 当前线程调用 t.join() 方法时,当前线程从 RUNNABLE --> WAITING
注意是当前线程在t 线程对象的监视器上等待
- t 线程运行结束,或调用了当前线程的 interrupt() 时,当前线程从 WAITING --> RUNNABLE
- RUNNABLE <–> WAITING
-
当前线程调用 LockSupport.park() 方法会让当前线程从 RUNNABLE --> WAITING
-
调用 LockSupport.unpark(目标线程) 或调用了线程 的 interrupt() ,会让目标线程从 WAITING --> RUNNABLE
- 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
- RUNNABLE <–> TIMED_WAITING
- 当前线程调用 t.join(long n) 方法时,当前线程从 RUNNABLE --> TIMED_WAITING
注意是当前线程在t 线程对象的监视器上等待
- 当前线程等待时间超过了 n 毫秒,或t 线程运行结束,或调用了当前线程的 interrupt() 时,当前线程从TIMED_WAITING --> RUNNABLE
- RUNNABLE <–> TIMED_WAITING
-
当前线程调用 Thread.sleep(long n) ,当前线程从 RUNNABLE --> TIMED_WAITING
-
当前线程等待时间超过了 n 毫秒,当前线程从 TIMED_WAITING --> RUNNABLE
- RUNNABLE <–> TIMED_WAITING
-
当前线程调用 LockSupport.parkNanos(long nanos) 或 LockSupport.parkUntil(long millis) 时,当前线程从 RUNNABLE --> TIMED_WAITING
-
调用 LockSupport.unpark(目标线程) 或调用了线程 的 interrupt() ,或是等待超时,会让目标线程从TIMED_WAITING–> RUNNABLE
- RUNNABLE <–> BLOCKED
-
t 线程用 synchronized(obj) 获取了对象锁时如果竞争失败,从 RUNNABLE --> BLOCKED
-
持 obj 锁线程的同步代码块执行完毕,会唤醒该对象上所有 BLOCKED 的线程重新竞争,如果 其中 t 线程竞争成功,从 BLOCKED --> RUNNABLE ,其它失败的线程仍然 BLOCKED
- RUNNABLE <–> TERMINATED
- 当前线程所有代码运行完毕,进入 TERMINATED
本文详细介绍了Java中线程的六种状态及其转换方式,包括从NEW到RUNNABLE、RUNNABLE与其他状态间的转换等,并解释了各种转换发生的场景。
3万+

被折叠的 条评论
为什么被折叠?



