您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關如何深入理解Java多線程與并發框中線程的狀態,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
1. 新建狀態(New)
萬事萬物都不是憑空出現的,線程也一樣,它被創建后的狀態稱為 新建 狀態。
比如:
Thread thread = new Thread();
2. 可運行狀態(Runable)
線程被創建后是不能使用的,就是讓用戶在此期間設置一些屬性,
比如:
// 設置類加載器 thread.setContextClassLoader(System.class.getClassLoader()); // 設置線程名稱 thread.setName("商品服務-product-service"); // 是否為守護線程/用戶線程 thread.setDaemon(false); // 設置線程優先級 thread.setPriority(5);
通過 thread.start() 方法開啟線程,開啟后意味著該線程 “能夠” 運行,并不意味著一定會運行,因為它要搶占資源,獲取CPU的使用權后,才能運行。所以此狀態稱為 可運行狀態。從上圖中可以看出,不僅通過 start() 啟動一個線程后可以進入 Runnable 狀態,還可以通過其他方式到達 Runnable 狀態。
3. 運行狀態(Running)
線程通過努力,獲得了CPU的使用權,就會進入執行程序,此時狀態被稱為 運行狀態。
4. 阻塞狀態(BLOCKED)
多線程搶占CPU資源,同一時刻僅有一個線程進入臨界區,為保證對資源訪問的線程安全,同一時刻僅有一個線程進入 synchronized 同步塊,而其他未獲得訪問權的線程將進入 阻塞狀態 。
等待阻塞:通過調用線程的wait()方法,讓線程等待某工作的完成。
同步阻塞:線程在獲取synchronized同步鎖失敗(因為鎖被其它線程所占用),它會進入同步阻塞狀態。
其他阻塞:通過調用線程的sleep()或join()或發出了I/O請求時,線程會進入到阻塞狀態。當sleep()狀態超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉入就緒狀態。
5. 睡眠狀態 TIMED_WAITING(sleeping)
通過調用對象的wait(time)方法或調用線程的sleep(time)/join(time),等待/睡眠指定的時間,此時該線程會進入TIMED_WAITING(sleeping) 狀態,直接時間已到,會進入Runnable狀態,重新搶占CPU資源。
6. 等待狀態 WAITING
通過調用對象的wait()方法,讓搶占資源的線程等待某工作的完成,或主動join()其他線程,讓當前線程釋放資源等待被join的線程完成工作,而該線程將進入 等待狀態 。
7. 死亡狀態(Dead)
線程執行完了或者因異常退出了run()方法,該線程結束生命周期。
以上就是如何深入理解Java多線程與并發框中線程的狀態,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。