本篇內容主要講解“java線程狀態(tài)有哪些幾種”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“java線程狀態(tài)有哪些幾種”吧!
公司主營業(yè)務:網(wǎng)站設計制作、網(wǎng)站建設、移動網(wǎng)站開發(fā)等業(yè)務。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)推出榆次免費做網(wǎng)站回饋大家。
多線程高并發(fā)是初級開發(fā)者邁向中高級開發(fā)者必須要掌握的能力, 萬丈高樓平地起, 在深入了解這部分內容前, 我們要明確最基本的概念, 即線程有哪些狀態(tài).
得益于開源精神, 我們可以直觀的分析看到在Java中, 線程到底有哪些狀態(tài). Java中記錄線程所有狀態(tài)的枚舉類為
java.lang.Thread.State
從源代碼中我們可以看到在Java中線程總共有6種狀態(tài)NEW, RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, TERMINATED. 下面我們來看一下詳細的源代碼, 以及各種線程狀態(tài)的含義.
public enum State {
/**
* 線程對象實例化但是還沒有調用start方法.
*/
NEW,
/**
* 線程處于可運行狀態(tài), 這個狀態(tài)在虛擬機中
* 看來是正在執(zhí)行的, 但是實際可能在等待
* 操作系統(tǒng)的資源, 比如等待CPU資源.
* 注意Java線程狀態(tài)只有RUNNABLE而沒有RUNNING
*/
RUNNABLE,
/**
* 阻塞狀態(tài)的線程可能在等待獲取鎖,
* 也可能是調用了wait方法后被notify方法
* 喚醒, 再次嘗試獲取鎖, 進入阻塞狀態(tài)
* {@link Object#wait() Object.wait}.
*/
BLOCKED,
/**
* 等待狀態(tài), 此狀態(tài)由于調用wait, join, park方法導致
* <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>
*
* 線程進入等待狀態(tài)后, 等待notify, notifyAll,
* 特定線程執(zhí)行完畢, unpark方法
* 然后轉換為RUNNABLE狀態(tài)
*/
WAITING,
/**
* 有最大時間限制的等待狀態(tài)
* 可能由調用如下方法導致
* <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,
/**
* 終止狀態(tài), 線程執(zhí)行完畢后會進入
* TERMINATED狀態(tài)
* 并且不能再轉換成其它狀態(tài)
*/
TERMINATED;
}
為了增強記憶, 下面我們用10句有效代碼, 直觀的把Java線程的6種狀態(tài)展示出來.
/**
* 如下展示了java線程的6種狀態(tài)
* NEW 線程對象新創(chuàng)建還未start
* RUNNABLE 線程已經啟動, 線程在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í)行完畢, 已經被終止
* @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) {
// 嘗試獲取鎖, 獲取不到進入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("線程已經啟動, 狀態(tài)為: {}", thread.getState());
TimeUnit.SECONDS.sleep(1);
log.info("線程已經park, 狀態(tài)為: {}", thread.getState());
LockSupport.unpark(thread);
TimeUnit.SECONDS.sleep(3);
log.info("線程啟動后進入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("線程已經執(zhí)行結束, 狀態(tài)為: {}", thread.getState());
}
執(zhí)行結果為
- 線程創(chuàng)建還未啟動, 狀態(tài)為: NEW
- 線程已經啟動, 狀態(tài)為: RUNNABLE
- 線程已經park, 狀態(tài)為: WAITING
- 線程啟動后進入sleep狀態(tài), 狀態(tài)為: TIMED_WAITING
- 線程等待鎖, 狀態(tài)為: BLOCKED
- 線程已經執(zhí)行結束, 狀態(tài)為: TERMINATED
下面我們避免繁瑣的流程圖, 簡單描述下下線程狀態(tài)的相互轉換.
到此,相信大家對“java線程狀態(tài)有哪些幾種”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續(xù)學習!
當前名稱:java線程狀態(tài)有哪些幾種
分享網(wǎng)址:http://sd-ha.com/article8/gegjop.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設、品牌網(wǎng)站制作、定制網(wǎng)站、定制開發(fā)、微信公眾號、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)