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