Java線程狀態Jstack線程狀態BLOCKED/TIMED_WAITING/WAITING解釋

一、線程5種狀態

  1. 新建狀態(New) 新創建了一個線程對象。

  2. 就緒狀態(Runnable) 線程對象創建后,其他線程調用了該對象的start()方法。該狀態的線程位于可運行線程池中,變得可運行,等待獲取CPU的使用權。

  3. 運行狀態(Running) 就緒狀態的線程獲取了CPU,執行程序代碼。

  4. 阻塞狀態(Blocked) 阻塞狀態是線程因為某種原因放棄CPU使用權,暫時停止運行。直到線程進入就緒狀態,才有機會轉到運行狀態。阻塞的情況分三種:

    • 等待阻塞:運行的線程執行wait()方法,JVM會把該線程放入等待池中。
    • 同步阻塞:運行的線程在獲取對象的同步鎖時,若該同步鎖被別的線程占用,則JVM會把該線程放入鎖池中。
    • 其他阻塞:運行的線程執行sleep()或join()方法,或者發出了I/O請求時,JVM會把該線程置為阻塞狀態。當sleep()狀態超時、join()等待線程終止或者超時、或者I/O處理完畢時,線程重新轉入就緒狀態。
  5. 死亡狀態(Dead):線程執行完了或者因異常退出了run()方法,該線程結束生命周期。

這里寫圖片描述


二、Jstack中常見的線程狀態

應用程序啟動后,我們對系統運行狀況的觀測大部分情況下是通過運行日志。但是若某一天發現,日志中記錄的行為與預想的不一致,此時需要進一步的系統監控該怎么辦,Jstack是常用的排查工具,它能輸出在某一個時間,java進程中所有線程的狀態,很多時候這些狀態信息能給我們的排查工作帶來有用的線索。?
Jstack的輸出中,Java線程狀態主要是以下幾種:

  • RUNNABLE?線程運行中或I/O等待
  • BLOCKED?線程在等待monitor鎖(synchronized關鍵字)
  • TIMED_WAITING?線程在等待喚醒,但設置了時限
  • WAITING?線程在無限等待喚醒

這里Jstack使用的關鍵字描述的線程狀態與上一節中線程不太一樣,所以可能理解上的可能會出現混淆。雖然Java中的線程一樣有上節中描述的5種狀態,但在實際情況下線程新建狀態和死亡狀態持續很短,我們也并不太關心。大多時候我們關注的是運行狀態/阻塞狀態,這里弄清楚Jstack的輸出含義即可。下面用簡單的代碼產生出以上4中狀態。

    public static void main(String[] args) {System.out.println(Utils.pid());runnable();     // 1 // blocked(); // 2 // waiting(); // 3 // timedWaiting(); // 4 } public static String pid() { String name = ManagementFactory.getRuntimeMXBean().getName(); return name.split("@")[0]; }

這里為了方便得到java進程id,直接使用pid()函數輸出。為了方便,我們把觀察線程固定為”main”,因為JVM還有其他線程都會存在輸出中,我們可以通過關鍵字”main”找到我們要觀察的線程。命令jstack -l [pid]。

1) 讓線程一直處于RUNNABLE

    public static void runnable() {long i = 0; while (true) { i++; } }

沒什么好解釋的,死循環即可。

2) 讓線程一直處于BLOCKED

    public static void blocked() {final Object lock = new Object(); new Thread() { public void run() { synchronized (lock) { System.out.println("i got lock, but don't release"); try { Thread.sleep(1000L * 1000); } catch (InterruptedException e) { } } } }.start(); try { Thread.sleep(100); } catch (InterruptedException e) {} synchronized (lock) { try { Thread.sleep(30 * 1000); } catch (InterruptedException e) { } } }

主線程sleep,先讓另外一個線程拿到lock,并長期持有lock(sleep會持有鎖,wait不會)。此時主線程會BLOCK住等待lock被釋放,此時jstack的輸出可以看到main線程狀態是BLOCKED。這里要注意的是只有synchronized這種方式的鎖(monitor鎖)才會讓線程出現BLOCKED狀態,等待ReentrantLock則不會。

3) 讓線程處于TIMED_WAITING狀態

    public static void timedWaiting() {final Object lock = new Object(); synchronized (lock) { try { lock.wait(30 * 1000); } catch (InterruptedException e) { } } }

用Lock.tryLock(timeout, timeUnit),這種方式也會看到TIMED_WAITING狀態,這個狀態說明線程當前的等待一定是可超時的。

4) 讓線程處于WAITING狀態

    public static void waiting() {final Object lock = new Object(); synchronized (lock) { try { lock.wait(); } catch (InterruptedException e) { } } }

無超時的等待,必須等待lock.notify()或lock.notifyAll()或接收到interrupt信號才能退出等待狀態。同理,ReentrantLock.lock()的無參方法調用,也會使線程狀態變成WAITING。


通過以上幾個最簡單的例子,讓線程達到jstack輸出中常見的幾種狀態,可以更好地理解jstack輸出。

轉載于:https://www.cnblogs.com/barrywxx/p/8576358.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453252.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453252.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453252.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

彩票相關知識

很多人做夢都想中得彩票頭獎,很多人希望天上能掉下餡餅來砸中自己,很多人在作白日夢……彩票是一種風險投資,是一種四兩撥千斤的氣勢,更是一種眾人拾柴火焰高的真實寫照,沒買過彩票的人是很難體會那種美好的期望及期望…

(模擬信號/數字信號)分別以(模擬信號/數字信號)中傳輸方式

1、基本概念、基本術語和數據通信系統 1.基本概念和基本術語 數據:能夠由計算機處理的數字、字母和符號等具有一定意義的實體。 分類:模擬數據可以在一定的數據區域中取連續的值,如聲音和圖像;數字數據只能取離散的數值&#xff0…

C# 獲取文件名及擴展名

C#通過文件路徑獲取文件名 string fullPath "/WebSite1/Default.aspx";string filename System.IO.Path.GetFileName(fullPath);//文件名 “Default.aspx” string extension System.IO.Path.GetExtension(fullPath);//擴展名 “.aspx” string fileNameWithoutEx…

android11 rom,小米打造基于安卓11的ROM來了:米10嘗鮮

原標題:小米打造基于安卓11的ROM來了:米10嘗鮮據XDA報道,距離Android 11正式版發布還有幾天時間,9月8日正式面向Pixel 2、Pixel 3、Pixel 4和Pixel 3a等機型推送Android 11正式版。另一方面,各大手機品牌已經緊鑼密鼓開…

基于 HTML5 WebGL 的 3D 服務器與客戶端的通信

這個例子的初衷是模擬服務器與客戶端的通信,我把整個需求簡化變成了今天的這個例子。3D 機房方面的模擬一般都是需要鷹眼來輔助的,這樣找產品以及整個空間的概括會比較明確,在這個例子中我也加了,這篇文章就算是我對這次項目的一個…

什么是順序執行以及其特點

順序執行是程序的一種執行方式。是把一個具有獨立功能的程序獨占處理機直至最終結束的過程稱為程序的順序執行 順序執行的特點:順序性:程序順序執行時,其執行過程可看作一系列嚴格按程序規定的狀態轉移過程,也即是每執行一條指令&…

一年成為Emacs高手(像神一樣使用編輯器)

作者: 陳斌(redguardtoo) 更新時間: 2012-02-10 五 原創時間: 2012-01-31 周二 15:08 很容易.一年多前我還在Vi陣營,偶爾使用Emacs還總是忘記退出(C-x C-c)的快捷鍵,但是一年后我跨入高手行列. 現在網上很多中文文章都是和你強調Emacs有多牛,以激發你的興趣.最有名的大概是王垠…

七種常見的核酸序列蛋白編碼能力預測工具 | ncRNAs | lncRNA

注:這些工具的應用都是受限的,有些本來就是只能用于預測動物,在使用之前務必用ground truth數據來測試一些。我想預測某一個植物的轉錄本,所以可以拿已經注釋得比較好的擬南芥來測試一下。(測試的結果還是比較驚人的&a…

android預覽界面編譯出錯,Android O預覽findViewById編譯錯誤

我試圖測試Android O Developer Preview的第二階段。 項目創建后,我只是點擊了構建并運行但我沒有任何成功。Android默認生成的代碼如下:Toolbar toolbar (Toolbar) findViewById(R.id.toolbar);發生編譯錯誤。Error:(18, 37) error: reference to find…

中斷與異常的區別

中斷: 中斷是CPU(硬件)所具備的功能 ,它是指系統停止當前正在運行的程序而轉向其他服務,可能是因 為優先級高的請求服務了,或者是因為人為安排中斷。中斷是屬于正常現象。主要由CPU以外的事件引起的 中斷…

寒武紀找到了引領中國AI芯片走向世界的路

大約6億年前在地質學上被稱作“寒武紀”的時代,大量無脊椎動物在短時間內出現“生命大爆發”。如今,“寒武紀”這個名字再次被人們提及,它源自中科院計算所研發的人工智能芯片處理器的命名,意喻人工智能即將迎來大爆發的時代。“寒…

淺談PPM (Project Portfolio Management)

前言: 本文以純理論性的PPM講解為主,不會涉及到具體如何實施,我會在以后介紹詳細的PPM實施方案介紹。 PPM,可能很多人并不清楚甚至可能沒聽說過,這是一個近些年才流行起來的概念,是Project Portfolio Mana…

poj 3071 Football

http://poj.org/problem?id3071 2^n 支足球隊比賽,共比n場,第一場1號與2號比,3號與4號比…… 每場勝出者進入下一場,輸者淘汰 每一場都是相鄰的兩個隊伍比拼 已知任意兩個隊伍比拼獲勝的概率 求最后哪只隊伍獲勝的概率最大 dp[i]…

進程調度與作業調度

進程調度是真正讓某個就緒狀態的進程到處理機上運行,而作業調度只是使作業具有了競爭處理機的機會。進程調度(又稱微觀調度、低級調度、短程調度): 是按照某種調度算法從就緒狀態的進程中選擇一個進程到處理機上運行。負責進程調…

tensorflow源碼安裝

主要參考:https://www.tensorflow.org/install/install_sources#ConfigureInstallation卸載tensorflow sudo pip uninstall tensorflow 安裝git 安裝git時記得先安裝,后更新系統 sudo apt install git安裝jdk8: myubuntu:~$ java myubun…

Makefile學習之通配符和自動變量

規則中的通配符 “*” ,“?” ,“ [...]”, " % " , " wildcard " 1.“*” *.c表示所有后綴為.C的文件; 如果文件中用到通配符,使用“\*”; 2.通配符在變量中的使用; objects*.c 注意…

英語中十二個月名稱的由來

轉自網絡,原出處不詳。 公歷一年有12個月,但不少人并不知道12 個月的英語名稱的來歷。公歷起源于古羅馬歷法。羅馬的英語原來只有10 個月,古羅馬皇帝決定增加兩個月放在年尾,后來朱里斯*凱撒大帝把這兩個月移到年初,…

進程和程序的關系

1 進程是一個動態概念,而程序是一個靜態概念。 2 進程具有并行特征,程序沒有。 3 進程是競爭資源的基本單位。 4 一個程序對應多個進程,一個進程為多個程序服務。

Android怎么插手機卡,魅藍E手機卡怎么裝 魅藍E手機SIM卡安裝圖文教程

昨天下午,魅族發布了全新系列魅藍手機——魅藍E,定位魅藍高端產品線,售價1299元,李楠號稱魅藍E采用三四千元的旗艦機工藝,外觀/屏幕/拍照提升明顯。此外,魅藍E依舊支持全網通雙卡雙待。那么魅藍E怎么插卡/裝…

快速冪總結

快速冪總結 快速冪這個東西比較好理解,但實現起來到不老好辦,記了幾次老是忘,今天把它系統的總結一下防止忘記。 首先,快速冪的目的就是做到快速求冪,假設我們要求a^b,按照樸素算法就是把a連乘b次,這樣一來…