(Java多线程)线程状态
生活随笔
收集整理的這篇文章主要介紹了
(Java多线程)线程状态
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 線程狀態概述
- Timed Wating(計時等待)
- Blocked(鎖阻塞)
- Waiting無限等待
線程狀態概述
在API中java.lang.Thread.State 這個枚舉給了6種線程狀態:
| NEW(新建) | 線程剛被創建,但是并未啟動。還沒調用start方法。 |
| Runnable(可運行) | 線程可以在java虛擬機中運行的狀態,可能正在運行自己代碼,也可能沒有,這取決于操作系統處理器。 |
| Waiting(無限等待) | 一個線程在等待另一個線程執行一個(喚醒) 動作時,該線程進入Waiting狀態。進入這個狀態后是不能自動喚醒的,必須等待另一個線程調用notify或者ntifyll方法才能夠喚醒。 |
| TimedWaiting(計時等待) | 同waiting狀態,有幾個方法有超時參數,調用他們將進入Timed Waiting狀態。這一狀態將一直保持到超時期滿或者接收到喚醒通知。帶有超時參數的常用方法有Thread.sleep、Object.wait. |
| Teminated(被終止) | 因為run方法正常退出而死亡,或者因為沒有捕獲的異常終止了run方法而死亡。 |
Timed Wating(計時等待)
- Timed Waiting在API中的描述為: 一個正在限時等待另一個線程執行一個(喚醒)動作的線程處于這一狀態。
- 在前面寫賣票的案例中,為了減少線程執行太快,現象不明顯等問題,在run方法中添加了sleep語句, 這樣就強制當前正在執行的線程休眠(暫停執行),以"減慢線程”。
- 當調用了sleep方法之后, 當前執行的線程就進入到“休眠狀態",就是所謂的Timed Waiting(計時等待)。
注意:
作關系。
中會睡眠
Timed Waiting線程狀態圖:
Blocked(鎖阻塞)
- Blocked狀態在API中的介紹為:一個正在阻塞等待一個監視器鎖 (鎖對象)的線程處于這一狀態。比如,線程A與線程B代碼中使用同一鎖,如果線程A獲取到鎖,線程A進入到Runnable狀態,那么線程B就進入到Blocked鎖阻塞狀態。
- 這是由Runnable狀態進入Blocked狀態。除此Waiting以及 Time Waiting狀態也會在某種情況下進入阻塞狀態。
Blocked線程狀態圖
Waiting無限等待
- Wating狀態在API中介紹為: 一個正在無限期等待另一個線程執行一個特別的(喚醒)動作的線程處于這一狀態。
案例演示:
public class Demo04Waiting {//創建鎖對象public static Object obj = new Object();public static void main(String[] args) {new Thread(new Runnable() {@Overridepublic void run() {while (true){synchronized (obj){System.out.println("顧客點菜");System.out.println("點完菜,等待上菜........");try {//進入無線等待,等待老板做菜obj.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}}).start();new Thread(new Runnable() {@Overridepublic void run() {while (true) {synchronized (obj) {try {Thread.sleep(3000);//等待5秒} catch (InterruptedException e) {e.printStackTrace();}System.out.println("菜做好了");obj.notify();}}}}).start();} }- 通過上述案例發現,一個調用了某個對象的Objet.wait方法的線程會等待另一個線程調用此對象的object.notify()方法或0bject.ntifyll()方法。
- waiting狀態并不是一個線程的操作, 它體現的是多個線程間的通信,可以理解為多個線程之間的協作關系,多個線程會爭取鎖,同時相互之間又存在協作關系。
- 當多個線程協作時,比如A, B線程,如果A線程在Runnable (可運行)狀態中調用了wait()方法那么A線程就進入了Waiting (無限等待)狀態,同時失去了同步鎖。假如這個時候B線程獲取到了同步鎖,在運行狀態中調用了notify()方法,那么就會將無限等待的A線程喚醒。注意是喚醒,如果獲取到鎖對象,那么A線程喚醒后就進入Runnable (可運行)狀態;如果沒有獲取鎖對象,那么就進入到Blocked (鎖阻塞狀態)。
Waiting線程狀態圖
總結
以上是生活随笔為你收集整理的(Java多线程)线程状态的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (Java多线程)线程安全问题
- 下一篇: (仿头条App项目)9.视频列表页面实现