準備
- 爲了方便,直接使用 visualvm
- 附一張java 線程狀態圖(來源於知乎:java線程運行怎麼有第六種狀態? - 山月風成的回答 - 知乎
https://www.zhihu.com/question/56494969/answer/556847141)
需要注意,java 線程的狀態是沒有 ready 和 running 這兩個狀態的,這兩個狀態其實就是 runnable 狀態。
線程狀態的變更
1、new 一個線程,執行任務
代碼:
public static void testRunnable(){
Runnable task = ()->{
while(true){
System.out.println(Thread.currentThread().getId());
}
};
Thread t = new Thread(task);
t.setName("mytest");
t.start();
}
線程棧信息:
狀態變更:
(new ->)Runnable->Terminated
2、使用 synchronized 鎖的時候,需要先等待鎖,然後再執行
代碼:
線程棧:
首先,在執行到 18 行的時候,打印線程堆棧(因爲 main 線程會持有鎖很長時間,所以有充足時間打印線程棧),這時,mytest 線程的狀態是 blocked
然後,獲取鎖後,線程狀態改爲 Runnable
3、使用 synchronized 鎖的時候,成功獲取了鎖,然後執行 wait 方法
代碼:
線程棧:
執行了 21 行,線程狀態變爲 waiting
然後,main 線程 notify ”mytest“線程,變成 Runnable 繼續執行
4、線程池執行完任務,核心池中的線程的waiting 狀態
代碼:
線程棧: