java線程狀態(tài)有哪些幾種

本篇內(nèi)容主要講解“java線程狀態(tài)有哪些幾種”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“java線程狀態(tài)有哪些幾種”吧!

公司主營業(yè)務(wù):網(wǎng)站設(shè)計制作、網(wǎng)站建設(shè)、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)推出榆次免費做網(wǎng)站回饋大家。

為什么要了解java線程的狀態(tài)

多線程高并發(fā)是初級開發(fā)者邁向中高級開發(fā)者必須要掌握的能力, 萬丈高樓平地起, 在深入了解這部分內(nèi)容前, 我們要明確最基本的概念, 即線程有哪些狀態(tài). 

從源碼來看Java線程有哪些狀態(tài)

得益于開源精神, 我們可以直觀的分析看到在Java中, 線程到底有哪些狀態(tài). Java中記錄線程所有狀態(tài)的枚舉類為

java.lang.Thread.State 

從源代碼中我們可以看到在Java中線程總共有6種狀態(tài)NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED. 下面我們來看一下詳細(xì)的源代碼, 以及各種線程狀態(tài)的含義.

public enum State {
   /**
    * 線程對象實例化但是還沒有調(diào)用start方法.
    */
   NEW,

   /**
    * 線程處于可運行狀態(tài), 這個狀態(tài)在虛擬機中
    * 看來是正在執(zhí)行的, 但是實際可能在等待
    * 操作系統(tǒng)的資源, 比如等待CPU資源.
    * 注意Java線程狀態(tài)只有RUNNABLE而沒有RUNNING
    */
   RUNNABLE,

   /**
    * 阻塞狀態(tài)的線程可能在等待獲取鎖,
    * 也可能是調(diào)用了wait方法后被notify方法
    * 喚醒, 再次嘗試獲取鎖, 進(jìn)入阻塞狀態(tài)
    * {@link Object#wait() Object.wait}.
    */
   BLOCKED,

   /**
    * 等待狀態(tài), 此狀態(tài)由于調(diào)用wait, join, park方法導(dǎo)致
    * <ul>
    *   <li>{@link Object#wait() Object.wait} with no timeout</li>
    *   <li>{@link #join() Thread.join} with no timeout</li>
    *   <li>{@link LockSupport#park() LockSupport.park}</li>
    * </ul>
    *
    * 線程進(jìn)入等待狀態(tài)后, 等待notify, notifyAll,
    * 特定線程執(zhí)行完畢, unpark方法
    * 然后轉(zhuǎn)換為RUNNABLE狀態(tài)
    */
   WAITING,

   /**
    * 有最大時間限制的等待狀態(tài)
    * 可能由調(diào)用如下方法導(dǎo)致
    * <ul>
    *   <li>{@link #sleep Thread.sleep}</li>
    *   <li>{@link Object#wait(long) Object.wait} with timeout</li>
    *   <li>{@link #join(long) Thread.join} with timeout</li>
    *   <li>{@link LockSupport#parkNanos LockSupport.parkNanos}</li>
    *   <li>{@link LockSupport#parkUntil LockSupport.parkUntil}</li>
    * </ul>
    */
   TIMED_WAITING,

   /**
    * 終止?fàn)顟B(tài), 線程執(zhí)行完畢后會進(jìn)入
    * TERMINATED狀態(tài)
    * 并且不能再轉(zhuǎn)換成其它狀態(tài)
    */
   TERMINATED;
}
   

10句代碼窮盡線程的6種狀態(tài)

為了增強記憶, 下面我們用10句有效代碼, 直觀的把Java線程的6種狀態(tài)展示出來.

/**
* 如下展示了java線程的6種狀態(tài)
* NEW 線程對象新創(chuàng)建還未start
* RUNNABLE 線程已經(jīng)啟動, 線程在JVM中正在運行, 不過在系統(tǒng)層面可能在等待系統(tǒng)資源
* BLOCKED 線程等待獲取鎖
* WAITING 線程被LockSupport#park(),
* Object#wait()或者Thread.join, 等待被unpark或者notify或者其他新城join完畢
* TIMED_WAITING 線程sleep或者wait(long),
* LockSupport#parkNanos LockSupport.parkNanos, 等待指定時間后繼續(xù)執(zhí)行
* TERMINATED 線程執(zhí)行完畢, 已經(jīng)被終止
* @throws BrokenBarrierException
* @throws InterruptedException
*/
@Test
public void testThreadStatus() throws BrokenBarrierException, InterruptedException {
   CyclicBarrier cyclicBarrier = new CyclicBarrier(2);
   Thread thread = new Thread(() -> {
       try {
           LockSupport.park(this);
           TimeUnit.SECONDS.sleep(5);
           synchronized (ThreadTest.class) {
               // 嘗試獲取鎖, 獲取不到進(jìn)入Blocked狀態(tài)等待鎖
           }
           cyclicBarrier.await();
       } catch (InterruptedException e) {
           e.printStackTrace();
       } catch (BrokenBarrierException e) {
           e.printStackTrace();
       }
   });
   log.info("線程創(chuàng)建還未啟動, 狀態(tài)為: {}", thread.getState());
   thread.start();
   log.info("線程已經(jīng)啟動, 狀態(tài)為: {}", thread.getState());
   TimeUnit.SECONDS.sleep(1);
   log.info("線程已經(jīng)park, 狀態(tài)為: {}", thread.getState());
   LockSupport.unpark(thread);
   TimeUnit.SECONDS.sleep(3);
   log.info("線程啟動后進(jìn)入sleep狀態(tài), 狀態(tài)為: {}", thread.getState());
   synchronized (ThreadTest.class) {
       // 前面sleep了4秒, 5到7秒main線程持有鎖.
       // 子線程第6秒開始獲取鎖, 但需要等待main線程釋放鎖, 此時子線程是BLOCKED狀態(tài)
       TimeUnit.SECONDS.sleep(3);
       log.info("線程等待鎖, 狀態(tài)為: {}", thread.getState());
   }
   cyclicBarrier.await();
   log.info("線程已經(jīng)執(zhí)行結(jié)束, 狀態(tài)為: {}", thread.getState());
}
 

執(zhí)行結(jié)果為

- 線程創(chuàng)建還未啟動, 狀態(tài)為: NEW
- 線程已經(jīng)啟動, 狀態(tài)為: RUNNABLE
- 線程已經(jīng)park, 狀態(tài)為: WAITING
- 線程啟動后進(jìn)入sleep狀態(tài), 狀態(tài)為: TIMED_WAITING
- 線程等待鎖, 狀態(tài)為: BLOCKED
- 線程已經(jīng)執(zhí)行結(jié)束, 狀態(tài)為: TERMINATED

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

下面我們避免繁瑣的流程圖, 簡單描述下下線程狀態(tài)的相互轉(zhuǎn)換.

  1. new可以轉(zhuǎn)換為runnable
  2. runnable可能轉(zhuǎn)換為blocked或waiting, timed_waiting中的一種
  3. blocked或waiting, timed_waiting狀態(tài)在條件滿足后可以轉(zhuǎn)換為runnable
  4. 線程執(zhí)行完畢后, 進(jìn)入terminated狀態(tài)

到此,相信大家對“java線程狀態(tài)有哪些幾種”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

當(dāng)前名稱:java線程狀態(tài)有哪些幾種
分享網(wǎng)址:http://bm7419.com/article8/gegjop.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、品牌網(wǎng)站制作、定制網(wǎng)站、定制開發(fā)、微信公眾號、靜態(tài)網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)