c++thread里暂停线程_Java线程的 6 种状态
作者:( ?? ω ?? )y
出處:https://www.cnblogs.com/laishenghao/p/13972421.html
一、線程狀態(tài)的枚舉
Java的線程從創(chuàng)建到銷毀總共有6種狀態(tài)。這些狀態(tài)被定義在Thread類種的內(nèi)部枚舉 State 中,分別如下:
1、NEW:初始狀態(tài)。
線程實例已創(chuàng)建,但未啟動。
// 實例創(chuàng)建后,初始狀態(tài)為 NEWThread thread = new Thread();2、RUNNABLE:運行狀態(tài)。
線程正在JVM中執(zhí)行或等待操作系統(tǒng)資源(如CPU),包含 Ready(就緒)狀態(tài)和 Running(運行中)狀態(tài)。
(1) Ready 狀態(tài):該線程在可運行的狀態(tài),但在此刻線程調(diào)度器并沒有選擇執(zhí)行該線程。
(2) Running 狀態(tài):此刻線程調(diào)度器選擇執(zhí)行該線程,線程得到了CPU的時間片資源。
3、BLOCKED:阻塞狀態(tài)。
線程在等待獲取監(jiān)視器鎖資源,以便進入 synchronized 標(biāo)記的方法或者代碼塊。
4、WAITING:等待狀態(tài)。
當(dāng)調(diào)用以下方法后,線程將進入等待狀態(tài):
(1) Object.wait(); // 調(diào)用不帶超時參數(shù)的 wait() 方法。
(2) anotherThread.join(); // 調(diào)用另一個線程的不帶超時參數(shù)的 join() 方法。
(3) LockSupport.park(); / / 無限期掛起當(dāng)前線程。
5、TIMED_WAITING:超時等待狀態(tài)。
指定了超時時間的等待狀態(tài)。當(dāng)線程調(diào)用了如下方法后,線程將進入超時等待狀態(tài):
(1) Thread.sleep(long millis) 或 Thread.sleep(long millis, int nanos)
(2) Object.wait(long timeout) 或 Object.wait(long timeout, int nanos)
(3) anotherThread.join(long millis) 或 anotherThread.join(long millis, int nanos)
(4) LockSupport.parkNanos(Object blocker, long nanos) 或 LockSupport.parkUntil(Object blocker, long deadline)
可以看到,跟 WAITING 狀態(tài)相比,引起 TIMED_WAITING 狀態(tài)的方法,主要是多了超時參數(shù)。
6、TERMINATED:終止?fàn)顟B(tài)。
線程執(zhí)行完成或被中斷,將進入終止?fàn)顟B(tài)。進入終止?fàn)顟B(tài)后的線程,無法重啟啟動。
如果再次調(diào)用 start() 方法,將會拋出 IllegalThreadStateException 異常。
調(diào)用 run() 方法也不會有任何效果,線程內(nèi)部的 Runnable 對象也已經(jīng)被釋放。
二、線程狀態(tài)的轉(zhuǎn)換
Java線程狀態(tài)的轉(zhuǎn)換過程,如下圖所示。
三、線程狀態(tài)的獲取
當(dāng)前線程的狀態(tài)可以通過 Thread.currentThread().getState() 獲取。顯然,獲取自己的狀態(tài),得到的肯定是運行狀態(tài)。
一個線程實例的狀態(tài),可以通過 thread.getState() 方法獲取。
public class Main { public static void main(String[] args) throws InterruptedException { Thread thread = new Thread(() -> { // running:RUNNABLE System.out.println("running:" + Thread.currentThread().getState()); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }); // before start():NEW System.out.println("before start():" + thread.getState()); thread.start(); // 暫停一下主線程 Thread.sleep(100); // 由于線程內(nèi)sleep了1秒,此時將處于有限時間等待狀態(tài) // after start():TIMED_WAITING System.out.println("after start():" + thread.getState()); // 等待線程結(jié)束 thread.join(); // thread state:TERMINATED System.out.println("thread state:" + thread.getState()); }}測試Lock對應(yīng)的線程狀態(tài):
public class Main { private static final Lock LOCK = new ReentrantLock(); private static volatile int value = 0; public static void main(String[] args) throws InterruptedException { Thread alice = new Thread(() -> testLock("Alice")); Thread bob = new Thread(() -> testLock("Bob")); // alice before start():NEW System.out.println("alice before start():" + alice.getState()); alice.start(); // 暫停一下主線程 Thread.sleep(100); bob.start(); Thread.sleep(100); // bob.getState():WAITING System.out.println("bob.getState():" + bob.getState()); value = 1000; }? static void testLock(String name) { // 注意:鎖住的是代碼塊,不是里面用到的變量、資源 LOCK.lock(); try { System.out.println("Lock block code, name=" + name); // 注意:這是非線程安全的操作 value += 10; System.out.println("Before sleep(): name=" + name + ",value=" + value); Thread.sleep(1000); System.out.println("After sleep(): name=" + name + ",value=" + value); } catch (InterruptedException e) { e.printStackTrace(); } finally { LOCK.unlock(); } }}由上面的例子可見,等待進入 Lock.lock() 代碼塊的線程的狀態(tài),是 WAITING 狀態(tài),而不是 BLOCKED。
如果調(diào)用的是 Lock.tryLock(long, TimeUnit) 方法,對應(yīng)的狀態(tài)將是 TIMED_WAITING。
作者:( ?? ω ?? )y
出處:https://www.cnblogs.com/laishenghao/p/13972421.html
總結(jié)
以上是生活随笔為你收集整理的c++thread里暂停线程_Java线程的 6 种状态的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux图形界面为英文,Linux下“
- 下一篇: 大学计算机一级b笔记,全国计算机等级一级