Java多線程 線程狀態(tài)原理詳解
這篇文章主要介紹了Java多線程 線程狀態(tài)原理詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
java.lang.Thread.State枚舉定義了6種線程狀態(tài)。
- NEW: 尚未啟動(start)的線程的線程狀態(tài)
- RUNNABLE: 運行狀態(tài),但線程可能正在JVM中執(zhí)行,也可能在等待CPU調(diào)度
- BLOCKED: 線程阻塞,等待監(jiān)視器鎖以進入同步代碼塊/方法
- WAITING: 等待狀態(tài)。使用以下不帶超時的方式時會進入:Object.wait、Thread.join、LockSupport.park。等待狀態(tài)的線程需要另一個線程激活。
- TIMED_WAITING: 具有指定等待時間的等待狀態(tài),使用以下帶超時的方式:Thread.sleep、Object.wait、Thread.join、LockSupport.parkNanos、LockSupport.parkUntil。
- TERMINATED: 終止?fàn)顟B(tài)。線程正常執(zhí)行完畢或者發(fā)生異常。
狀態(tài)切換
狀態(tài) | 條件 | 狀態(tài) | 條件 | 狀態(tài) |
---|---|---|---|---|
NEW | -(啟動)-》 | RUNNABLE | -(等待鎖)-》 | BLOCKED |
RUNNABLE | 《-(拿到鎖)- | BLOCKED | ||
RUNNABLE | -(等待其他線程通知)-》 | WAITING | ||
RUNNABLE | 《-(收到其他線程通知)- | WAITING |
||
RUNNABLE | -(有超時時間的,等待其他線程通知)-》 | TIMED_WAITING |
||
RUNNABLE | 《-(收到其他線程通知,或者等待超時)- | TIMED_WAITING |
||
RUNNABLE | -(執(zhí)行結(jié)束)-》 | TERMINATED |
線程切換代碼示例
/** * 多線程運行狀態(tài)切換示例 */ public class Demo2 { public static void main(String[] args) throws Exception{ //第一種狀態(tài)切換 新建->運行->終止 System.out.println("###第一種狀態(tài)切換 新建->運行->終止###"); Thread thread1 = new Thread(()->{ System.out.println("thread1當(dāng)前狀態(tài):" + Thread.currentThread().getState()); System.out.println("thread1執(zhí)行完畢"); }); System.out.println("調(diào)用start之前,thread1當(dāng)前狀態(tài):" + thread1.getState()); thread1.start(); Thread.sleep(2000L); //等待thread1執(zhí)行結(jié)束 System.out.println("等待thread1執(zhí)行結(jié)束,當(dāng)前狀態(tài):" + thread1.getState()); System.out.println(); // thread1.start(); //此時會拋出java.lang.IllegalThreadStateException //第二種狀態(tài)切換 新建->運行->等待->運行->終止 System.out.println("###第二種狀態(tài)切換 新建->運行->等待->運行->終止###"); Thread thread2 = new Thread(()->{ try { Thread.sleep(1500L); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("thread2當(dāng)前狀態(tài):" + Thread.currentThread().getState()); System.out.println("thread2執(zhí)行完畢"); }); System.out.println("調(diào)用start之前,thread2當(dāng)前狀態(tài):" + thread2.getState()); thread2.start(); System.out.println("調(diào)用start之后,thread2當(dāng)前狀態(tài):" + thread2.getState()); Thread.sleep(200L); //等待一段時間令thread2進入sleep方法 System.out.println("調(diào)用start之后,等待200毫秒,thread2當(dāng)前狀態(tài):" + thread2.getState()); Thread.sleep(2000L); //等待thread2執(zhí)行結(jié)束 System.out.println("等待thread2執(zhí)行結(jié)束,當(dāng)前狀態(tài):" + thread2.getState()); System.out.println(); //第三種狀態(tài)切換 新建->運行->阻塞->運行->終止 System.out.println("###第三種狀態(tài)切換 新建->運行->阻塞->運行->終止###"); Thread thread3 = new Thread(()->{ synchronized (Demo2.class){ System.out.println("thread3當(dāng)前狀態(tài):" + Thread.currentThread().getState()); System.out.println("thread3執(zhí)行完畢"); } }); synchronized (Demo2.class){ System.out.println("調(diào)用start之前,thread3當(dāng)前狀態(tài):" + thread3.getState()); thread3.start(); System.out.println("調(diào)用start之后,thread3當(dāng)前狀態(tài):" + thread3.getState()); Thread.sleep(200L); System.out.println("等待200毫秒,thread3等待獲取鎖,thread3當(dāng)前狀態(tài):" + thread3.getState()); } Thread.sleep(1000L); //等待thread3執(zhí)行完畢 System.out.println("等待1秒,令thread3獲取鎖后執(zhí)行方法,thread3當(dāng)前狀態(tài):" + thread3.getState()); } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
springboot整合jsp,實現(xiàn)公交車站路線圖
這篇文章主要介紹了springboot整合jsp,實現(xiàn)公交車站路線圖的步驟,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下2021-01-01關(guān)于SpringMVC在Controller層方法的參數(shù)解析詳解
在SpringMVC中,控制器Controller負(fù)責(zé)處理由DispatcherServlet分發(fā)的請求,下面這篇文章主要給大家介紹了關(guān)于SpringMVC在Controller層方法的參數(shù)解析的相關(guān)資料,需要的朋友可以參考下2021-12-12spring的jdbctemplate的crud的基類dao
本文主要介紹了使用spring的jdbctemplate進行增刪改查的基類Dao的簡單寫法,需要的朋友可以參考下2014-02-02JAVA SpringBoot統(tǒng)一日志處理原理詳解
這篇文章主要介紹了SpringBoot的統(tǒng)一日志處理原理,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-09-09JAVA學(xué)習(xí)進階篇之時間與日期相關(guān)類
在日常的開發(fā)工作當(dāng)中,我們經(jīng)常需要用到日期相關(guān)的類,下面這篇文章主要給大家介紹了關(guān)于JAVA學(xué)習(xí)進階篇之時間與日期相關(guān)類的相關(guān)資料,文中通過實例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-09-09Java 實戰(zhàn)交易平臺項目之寵物在線商城系統(tǒng)
讀萬卷書不如行萬里路,只學(xué)書上的理論是遠(yuǎn)遠(yuǎn)不夠的,只有在實戰(zhàn)中才能獲得能力的提升,本篇文章手把手帶你用Java實現(xiàn)一個寵物在線商城系統(tǒng),大家可以在過程中查缺補漏,提升水平2021-11-11SpringBoot RestTemplate請求日志打印方式
這篇文章主要介紹了SpringBoot RestTemplate請求日志打印方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-07-07MAC?在類路徑或引導(dǎo)類路徑中找不到程序包?java.lang問題
這篇文章主要介紹了MAC?在類路徑或引導(dǎo)類路徑中找不到程序包?java.lang問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-11-11