日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

并发基础篇(四): java中线程的状态深入浅出

發(fā)布時(shí)間:2025/3/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 并发基础篇(四): java中线程的状态深入浅出 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、線程的五種狀態(tài)

??線程的生命周期可以大致分為5種,但這種說法是比較舊的一種說法,有點(diǎn)過時(shí)了,或者更確切的來說,這是操作系統(tǒng)的說法,而不是java的說法。但對(duì)下面所說的六種狀態(tài)的理解有所幫助,所以也寫出來,作為參考。
1. NEW: 線程的新建狀態(tài),是指通過New關(guān)鍵字創(chuàng)建了Thread類(或其子類)的對(duì)象。
2. RUNNABLE: 這種情況指的是Thread類的對(duì)象調(diào)用了start()方法,這時(shí)的線程就等待時(shí)間片輪轉(zhuǎn)到自己這,以便獲得CPU;第二種情況是線程在處于RUNNABLE狀態(tài)時(shí)并沒有運(yùn)行完自己的run方法,時(shí)間片用完之后回到RUNNABLE狀態(tài);還有種情況就是處于BLOCKED狀態(tài)的線程結(jié)束了當(dāng)前的BLOCKED狀態(tài)之后重新回到RUNNABLE狀態(tài)。
3. RUNNING: 這時(shí)的線程指的是獲得CPU的RUNNABLE線程,RUNNING狀態(tài)是所有線程都希望獲得的狀態(tài)。
4. DEAD: 處于RUNNING狀態(tài)的線程,在執(zhí)行完run方法之后,或者異常退出時(shí),就變成了DEAD狀態(tài)了。
5. BLOCKED: 這種狀態(tài)指的是處于RUNNING狀態(tài)的線程,出于某種原因,比如調(diào)用了sleep方法、等待用戶輸入等而讓出當(dāng)前的CPU給其他的線程。
注意: BLOCKED狀態(tài),包括三種類型狀態(tài):等待(wait)、睡眠(sleep)、阻塞(申請(qǐng)資源:I\O、對(duì)象的鎖);

二、線程的六種狀態(tài)

??在java中,線程的狀態(tài)其實(shí)是六種,對(duì)應(yīng)著枚舉類型 Thread.State 的六個(gè)枚舉常量:NEW 、BLOCKED、RUNNABLE、WAITING 、TIMED_WAITING、TERMINATED

1. NEW : 新建狀態(tài),至今尚未啟動(dòng)的線程的狀態(tài)。

static void NEW() {Thread t = new Thread ();//也就是可以理解為剛剛創(chuàng)建threadSystem. out.println(t.getState());}

2. BLOCKED: 阻塞狀態(tài),受阻塞并且正在等待監(jiān)視器鎖的某一線程的線程狀態(tài)。

private static void BLOCKED() {final Object lock = new Object();Runnable run = new Runnable() {@Overridepublic void run() {for(int i=0; i<Integer.MAX_VALUE; i++){synchronized (lock) {System. out.println(i);}}}};Thread t1 = new Thread(run);t1.setName( “t1”);Thread t2 = new Thread(run);t2.setName( “t2”);t1.start();t2.start();}

3. RUNNABLE: 可運(yùn)行線程的線程狀態(tài)。這里其實(shí)合并了兩種狀態(tài)(RUNNING、RUNABLE)

private static void RUNNABLE() {Thread t = new Thread(){public void run(){for(int i=0; i<Integer.MAX_VALUE; i++){System. out.println(i);}}};t.start();}

當(dāng)線程調(diào)用了start()方法之后,就是運(yùn)行狀態(tài)了。

4. WAITING : 等待狀態(tài),表示線程進(jìn)入狀態(tài)。進(jìn)入此狀態(tài)后,會(huì)無限等待,直到其他線程做出一些特定的動(dòng)作(喚醒通知、中斷通知)才會(huì)再次運(yùn)行。

private static void WAITING() {final Object lock = new Object();Thread t1 = new Thread(){@Overridepublic void run() {int i = 0;while(true ){synchronized (lock) {try {lock.wait();//調(diào)用這個(gè)方法,進(jìn)入等待狀態(tài)} catch (InterruptedException e) {}System. out.println(i++);}}}};Thread t2 = new Thread(){@Overridepublic void run() {while(true ){synchronized (lock) {for(int i = 0; i< 10000000; i++){System. out.println(i);}lock.notifyAll();}}}};t1.setName( “^^t1^^”);t2.setName( “^^t2^^”);t1.start();t2.start();}

5. TIMED_WAITING : 計(jì)時(shí)等待狀態(tài),此狀態(tài)與 WAITING 狀態(tài)有些類似,但它是有時(shí)間限制的,即只會(huì)等待一段指定的時(shí)間,當(dāng)時(shí)間到來前,沒有被喚醒或或中斷,那么時(shí)間到來了,就自動(dòng)”醒來”,進(jìn)入RUNNABLE狀態(tài)。

synchronized (lock) {try {lock.wait(60 * 1000L);//只會(huì)等待一段指定的時(shí)間,當(dāng)時(shí)間到來前,沒有被喚醒或或中斷} catch (InterruptedException e) {}System. out .println(i++);}

6. TERMINATED : 終止?fàn)顟B(tài),已終止線程的線程狀態(tài)。

private static void TERMINATED() {Thread t1 = new Thread();t1.start();System. out.println(t1.getState());try {Thread. sleep(1000L);} catch (InterruptedException e) {}System. out.println(t1.getState());}

三、線程的狀態(tài)轉(zhuǎn)換

  • 當(dāng)一個(gè)線程執(zhí)行了start方法后,不代表這個(gè)線程就會(huì)立即被執(zhí)行,只代表這個(gè)線程處于可運(yùn)行的狀態(tài),最終由OS的線程調(diào)度來決定哪個(gè)可運(yùn)行狀態(tài)下的線程被執(zhí)行。
  • 一個(gè)線程一次被選中執(zhí)行是有時(shí)間限制的,這個(gè)時(shí)間段叫做CPU的時(shí)間片,當(dāng)時(shí)間片用完但線程還沒有結(jié)束時(shí),這個(gè)線程又會(huì)變?yōu)榭蛇\(yùn)行狀態(tài),等待OS的再次調(diào)度;在運(yùn)行的線程里執(zhí)行Thread.yeild()方法同樣可以使當(dāng)前線程變?yōu)榭蛇\(yùn)行狀態(tài)。
  • 在一個(gè)運(yùn)行中的線程等待用戶輸入、調(diào)用Thread.sleep()、調(diào)用了其他線程的join()方法,則當(dāng)前線程變?yōu)樽枞麪顟B(tài)。
  • 阻塞狀態(tài)的線程用戶輸入完畢、sleep時(shí)間到、join的線程結(jié)束,則當(dāng)前線程由阻塞狀態(tài)變?yōu)榭蛇\(yùn)行狀態(tài)。
  • 運(yùn)行中的線程調(diào)用wait方法,此線程進(jìn)入等待隊(duì)列。
  • 運(yùn)行中的線程遇到synchronized同時(shí)沒有拿到對(duì)象的鎖標(biāo)記、等待隊(duì)列的線程wait時(shí)間到、等待隊(duì)列的線程被notify方法喚醒、有其他線程調(diào)用notifyAll方法,則線程變成鎖池狀態(tài)。
  • 鎖池狀態(tài)的線程獲得對(duì)象鎖標(biāo)記,則線程變成可運(yùn)行狀態(tài)。
  • 運(yùn)行中的線程run方法執(zhí)行完畢或main線程結(jié)束,則線程運(yùn)行結(jié)束。

文章有不當(dāng)之處,歡迎指正,你也可以關(guān)注我的微信公眾號(hào):好好學(xué)java,獲取優(yōu)質(zhì)學(xué)習(xí)資源。

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的并发基础篇(四): java中线程的状态深入浅出的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。