摘要:先上一張線程狀態轉換圖做如下說明代碼中共有除之外的種狀態,為了表示線程正在執行,特加了這種狀態。但是由于和以及用于協調對共享資源的存取,所以必須在塊中使用。所以即便狀態的線程被喚醒了,也需要再次獲得鎖,所以喚醒后進入狀態。
1.先上一張線程狀態轉換圖
做如下說明:代碼中共有除RUNNING之外的6種狀態,為了表示線程正在執行,特加了RUNNING這種狀態。我們需要重點關注RUNNABLE、BLOCKED、WAITING和TIME_WAITING四種狀態,jstack打印的線程堆棧中也會時時出現。
1)BLOCKED:很好理解,就是線程在等待獲取鎖進入同步塊或者同步方法中。兩個死鎖的線程即是Blocked。
2)WAITING:比BLOCKED狀態進步一些,指我已經獲得鎖了,但由于有些條件不滿足,我自己等會,調用object.wait()方法。等條件滿足了,別的線程調用notify再叫我。另外也可以調用Thread.join()方法,顧名思義就是調用別的線程的join方法,讓別人join進來先執行,那我就只能等會了。但是由于wait()和notify()以及notifyAll()用于協調對共享資源的存取,所以必須在synchronized塊中使用。所以即便wait狀態的線程被notfiy喚醒了,也需要再次獲得鎖,所以喚醒后進入Blocked狀態。
3)TIMED_WAITING:類比WAITING,差異是不需要notify()或者notifyAlL()方法喚醒,時間到了我自己醒了。另外sleep比較好理解,就是讓當前線程睡一會,與wait的區別是它不釋放鎖。
4)RUNNABLE不用多說,在JAVA虛擬機中已經在運行,但是在等待操作系統資源,比如CPU時間片。
2.模擬一段死循環代碼
public class NewTask2 implements Runnable{ @Override public void run() { while(true) { System.out.println("the thread name is:" + Thread.currentThread().getName()); } } } public class DemoApplication { public static void main(String[] args) throws Exception { Thread t = new Thread(new NewTask2()); t.run(); }
}
3.運行main函數,查看任務管理器,找到PID,2284
4.使用Process Explorer工具,找到2284進程并查看屬性。找到CPU占用最高線程TID,8840
5.將8840換算為16進制,即為2288,記下這個16進制數字
6.在cmd下執行jstack -l PID命令,即jstack -l 2284??梢钥吹絥id=0x2288線程堆棧信息,線程狀態為RUNNABLE和執行循環輸出的代碼行信息。另外也可以看到WAITING狀態的線程
簡單梳理了下線程狀態轉移流程并記錄一下線程堆棧常用定位方法。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66716.html
摘要:之前我們簡單的討論了一下關于中的同步還有一些鎖優化的問題,今天我們就來簡單的聊一聊關于中的死鎖問題。這里顯示兩個線程的狀態現在是處于阻塞狀態,然后都在等待鎖的獲取,我們再繼續往下看。 之前我們簡單的討論了一下關于Java中的同步還有一些鎖優化的問題,今天我們就來簡單的聊一聊關于Java中的死鎖問題。 這個問題我們在開發的時候,或多或少都能遇到,對業務邏輯沒有正確的梳理,又或者是在多線程...
摘要:通過分析線程狀態除了上述的分析,大多數情況下會基于分析當前各個線程的運行情況,如是否存在死鎖是否存在一個線程長時間持有鎖不放等等。 背景 記得前段時間,同事說他們測試環境的服務器cpu使用率一直處于100%,本地又沒有什么接口調用,為什么會這樣?cpu使用率居高不下,自然是有某些線程一直占用著cpu資源,那又如何查看占用cpu較高的線程? /** *一個線程占用較高的cpu資源 *...
摘要:用于生成虛擬機當前時刻的線程快照。線程快照就是當前虛擬機內每一條線程正在執行的方法堆棧的集合,生成線程快照的主要目的就是定位線程出現長時間停頓的原因,如線程死鎖死循環請求外部資源導致的長時間等待等都是導致線程長時間停頓的常見原因。 在JDK的命令行中,一般開發人員最耳熟能詳的肯定就是java,javac,javap等常用命令,不過在jdk/bin下還有許多其他的命令行工具,它們被用來監...
摘要:點擊進入我的博客命令行工具這些工具大多數是類庫的一層薄的包裝,它們的主要功能代碼是在類庫中實現的。可視化工具是到目前為止隨發布的功能最強大的運行監視和故障處理程序,并且可以預見在未來一段時間內都是官方主力發展的虛擬機故障處理工具。 點擊進入我的博客 3.1 JDK命令行工具 showImg(https://segmentfault.com/img/remote/14600000174...
閱讀 955·2021-11-17 09:33
閱讀 415·2019-08-30 11:16
閱讀 2468·2019-08-29 16:05
閱讀 3351·2019-08-29 15:28
閱讀 1393·2019-08-29 11:29
閱讀 1947·2019-08-26 13:51
閱讀 3385·2019-08-26 11:55
閱讀 1203·2019-08-26 11:31