真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

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

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

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

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

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

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

java.lang.Thread.State 

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

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

   /**
    * 線程處于可運(yùn)行狀態(tài), 這個(gè)狀態(tài)在虛擬機(jī)中
    * 看來(lái)是正在執(zhí)行的, 但是實(shí)際可能在等待
    * 操作系統(tǒng)的資源, 比如等待CPU資源.
    * 注意Java線程狀態(tài)只有RUNNABLE而沒(méi)有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)致
    *

        *  
  • {@link Object#wait() Object.wait} with no timeout

  •     *  
  • {@link #join() Thread.join} with no timeout

  •     *  
  • {@link LockSupport#park() LockSupport.park}

  •     *

    *
    * 線程進(jìn)入等待狀態(tài)后, 等待notify, notifyAll,
    * 特定線程執(zhí)行完畢, unpark方法
    * 然后轉(zhuǎn)換為RUNNABLE狀態(tài)
    */
   WAITING,

   /**
    * 有最大時(shí)間限制的等待狀態(tài)
    * 可能由調(diào)用如下方法導(dǎo)致
    *

        *  
  • {@link #sleep Thread.sleep}

  •     *  
  • {@link Object#wait(long) Object.wait} with timeout

  •     *  
  • {@link #join(long) Thread.join} with timeout

  •     *  
  • {@link LockSupport#parkNanos LockSupport.parkNanos}

  •     *  
  • {@link LockSupport#parkUntil LockSupport.parkUntil}

  •     *

    */
   TIMED_WAITING,

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

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

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

/**
* 如下展示了java線程的6種狀態(tài)
* NEW 線程對(duì)象新創(chuàng)建還未start
* RUNNABLE 線程已經(jīng)啟動(dòng), 線程在JVM中正在運(yùn)行, 不過(guò)在系統(tǒng)層面可能在等待系統(tǒng)資源
* BLOCKED 線程等待獲取鎖
* WAITING 線程被LockSupport#park(),
* Object#wait()或者Thread.join, 等待被unpark或者notify或者其他新城join完畢
* TIMED_WAITING 線程sleep或者wait(long),
* LockSupport#parkNanos LockSupport.parkNanos, 等待指定時(shí)間后繼續(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)建還未啟動(dòng), 狀態(tài)為: {}", thread.getState());
   thread.start();
   log.info("線程已經(jīng)啟動(dò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("線程啟動(dòng)后進(jìn)入sleep狀態(tài), 狀態(tài)為: {}", thread.getState());
   synchronized (ThreadTest.class) {
       // 前面sleep了4秒, 5到7秒main線程持有鎖.
       // 子線程第6秒開(kāi)始獲取鎖, 但需要等待main線程釋放鎖, 此時(shí)子線程是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)建還未啟動(dòng), 狀態(tài)為: NEW
- 線程已經(jīng)啟動(dòng), 狀態(tài)為: RUNNABLE
- 線程已經(jīng)park, 狀態(tài)為: WAITING
- 線程啟動(dòng)后進(jìn)入sleep狀態(tài), 狀態(tài)為: TIMED_WAITING
- 線程等待鎖, 狀態(tài)為: BLOCKED
- 線程已經(jīng)執(zhí)行結(jié)束, 狀態(tài)為: TERMINATED

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

下面我們避免繁瑣的流程圖, 簡(jiǎ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)在條件滿(mǎn)足后可以轉(zhuǎn)換為runnable
  4. 線程執(zhí)行完畢后, 進(jìn)入terminated狀態(tài)

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


網(wǎng)頁(yè)題目:java線程狀態(tài)有哪些幾種
標(biāo)題網(wǎng)址:http://weahome.cn/article/gegjop.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部