Java執行緒既可以創建,也可以銷毀,所以執行緒是有生命週期的,而執行緒的生命週期就可以用執行緒的六種狀態來描述。
從Thread類別的原始碼可以看出執行緒一共有6種狀態:
這六種狀態分別是:
1. New:初始狀態,執行緒被創建,沒有呼叫start()。
2. Runnable:運作狀態,Java執行緒把作業系統中的就緒和執行兩種狀態統一稱為「運行中」。
3. Blocked:阻塞,執行緒進入等待狀態,執行緒因為某些原因,放棄了CPU的使用權。
阻塞的幾個情況:
A. 等待阻塞:運行的執行緒執行了wait(),JVM會把目前執行緒放入等待佇列。
B. 同步阻塞:執行的執行緒在取得物件的同步鎖定時,如果該同步鎖定被其他執行緒佔用了,JVM會將目前執行緒放入鎖定池中。
C. 其他阻塞:執行的執行緒執行sleep(),join()或發出IO請求時,JVM會把目前執行緒設為阻塞狀態,當sleep()執行完,join()執行緒終止,IO處理完畢線程再次恢復。
4. Waiting:等待狀態。
5. timed_waiting:逾時等待狀態,逾時以後會自動回傳。
6. terminated:終止狀態,目前執行緒執行完畢。
執行緒的六種狀態之間的轉換:
當實例化一個執行緒之後,先進入初始狀態,也就是New狀態,此時執行緒在啟動的時候並不是立刻就運行,而是要等到作業系統調度之後才運行,然後調用start()進入運行狀態,即runnable,其中運行狀態中包括運行(running)和就緒(ready)兩種狀態,這兩種狀態在作業系統的調度下可以互相轉換,如果運行中的線程時間片被CPU搶佔的話就會變成就緒狀態;運行中的線程通過調用synchronized方法或synchronized塊進入阻塞狀態,即blocked,當線程取得到鎖定之後進入運行狀態;如果執行緒在執行過程中呼叫了sleep(),wait().join(),Locksupported.parkUtil()等方法時,會進入等待狀態(waiting)或超時等待狀態,即timed_waiting,再次呼叫notify(),notifyAll(),Locksupported.unpark()等方法時,又會重新進入運行時狀態,當執行緒執行完成時,就進入了終止狀態,即terminated狀態。
註:Locksupported是JDK 1.6提供的工具類,在java.util.concurrent套件中,它所提供的park,unpark方法比wait,notify方法的靈活性更高。
透過命令列的方式查看執行緒狀態
先介紹兩個指令:
1. Jps:JDK 1.5提供的顯示目前所有Java進程pid的命令,可以取得對應的進程pid。
2. Jstack:是Java虛擬機器自帶的一種堆疊追蹤工具,他可以列印給定的進程pid資訊和遠端偵錯服務的Java堆疊資訊。
具體操作步驟:
開啟終端機或命令列工具,輸入jps命令,取得pid;
輸入jstack pid,查看目前進程的資訊.
PHP中文網,有大量免費的JAVA入門教學,歡迎大家來學習!
以上是java線程的幾種狀態是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!