幾個場景下,從 java 線程棧信息看線程狀態的變化

準備

  • 爲了方便,直接使用 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 狀態

代碼:
在這裏插入圖片描述

線程棧:
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章