Java多線程與JConsole實踐:從線程狀態到性能優化!!!

目錄

  • 一、前言
  • 二、`JConsole `使用教程
  • 二、線程的基本狀態
    • 2.1新建狀態(New)
    • 2.2就緒狀態(Ready)
    • 2.3運行狀態(Running)
    • 2.4 阻塞狀態(Blocked)
    • 2.5. 等待狀態(Waiting)
    • 2.6 等待狀態(TIMED_WAITING)
    • 2.7終止狀態(TERMINATED)
  • 二、線程狀態的轉換
  • 三、線程安全與狀態管理
  • 四、總結

一、前言

在操作系統和并發編程中,線程作為最小的執行單位,其生命周期中會經歷多個不同的狀態。理解這些狀態及其轉換非常重要,因為它們直接關系到程序的正確性和性能。本文將詳細解析線程的各個狀態及其轉換關系。

二、JConsole 使用教程

JConsole 是一種 Java 監控和管理控制臺工具,可以用于監視 Java 虛擬機(JVM)的性能和資源利用情況。它提供了一種圖形化界面,可以實時查看 JVM 的運行狀態、內存使用情況、線程活動、垃圾回收等信息,以及執行一些管理操作

1.啟動JConsole

JConsole 是包含在 JDK 中的一個工具,因此首先要確保已經安裝了 JDK。然后,找到jconsole.exe的位置然后 雙擊 jconsole.exe 啟動 JConsole。
在這里插入圖片描述

2.連接到 Java 進程

啟動 JConsole 后,會彈出一個界面,顯示所有正在運行的 Java 進程。選擇要監控的 Java 進程,并點擊連接按鈕

我們先簡單看一個代碼:

public class Tsleep {public static void main(String[] args)  {Thread t=new Thread(()->{try {Thread.sleep(3000);System.out.println("運行線程...");} catch (InterruptedException e) {e.printStackTrace();}},"T1");t.start();System.out.println("main....線程運行...");}
}

啟動項目:然后打開jconsoel選中我們需要觀察的線程。
在這里插入圖片描述

3.本地連接

在本地進程中會展示出當前計算機所有正在運行的 Java 程序,只需選中雙擊進入,再點擊“不安全的連接”即可進入到監聽界面

在這里插入圖片描述

在這里插入圖片描述
然后我們就可以通過這個jconsole來更好的觀察線程狀態了。


二、線程的基本狀態

2.1新建狀態(New)

  • 當線程被創建時,線程處于新建狀態。
  • 此時線程尚未開始執行,只是被操作系統或運行時環境識別為一個線程對象。
  • 例如:使用 new Thread() 創建一個線程實例,線程處于新建狀態。

NEW: 安排了工作, 還未開始行動。

public class Tsleep {public static void main(String[] args)  {Thread t=new Thread(()->{try {Thread.sleep(10000);System.out.println("運行線程...");} catch (InterruptedException e) {e.printStackTrace();}},"T1");System.out.println(t.getState());t.start();}
}

在這里插入圖片描述

線程在start之前的狀態。
可以看到NEW狀態被打印出來了,這就是新建狀態。

2.2就緒狀態(Ready)

  • 線程被操作系統的調度器識別為可執行狀態,等待 CPU 資源。
  • 此時線程已經被初始化并且具備了運行條件。
    當線程被創建(如 new Thread())后,線程處于 Ready 狀態,但尚未開始執行。

例如:

Thread thread = new Thread(() -> {System.out.println("Hello, Thread!");
});
// 此時線程處于 Ready 狀態,但尚未調用 start()

2.3運行狀態(Running)

線程獲得 CPU 時間片,開始執行線程的 run() 方法。
這是線程執行任務的核心狀態。

RUNNABLE: 可工作的. 又可以分成正在工作中和即將開始工作

public class Dom12 {public static void main(String[] args) throws InterruptedException {Thread t=new Thread(()->{while (true){//這里什么都不做}});t.start();//真正工作的狀態System.out.println(t.getState());}
}

在這里插入圖片描述

Ready 狀態與 Running 狀態的區別

特性Ready 狀態(就緒狀態)Running 狀態(運行狀態)
CPU 資源等待 CPU 資源獲得 CPU 資源,正在執行任務
執行狀態未執行執行中
進入方式調用 start()、從阻塞/等待恢復調度器選擇并分配 CPU 時間片
退出方式獲得 CPU 后進入 Running 狀態時間片用完或被中斷,返回 Ready 狀態

2.4 阻塞狀態(Blocked)

  • 線程因等待某些資源(如 I/O、鎖等)而暫停執行。
  • 阻塞狀態的線程不在就緒隊列中,直到等待的資源可用才會解除阻塞。
  • 例如:線程嘗試獲取一個已經被其他線程占用的鎖時,會進入阻塞狀態。
package tset1;public class Tsleep {public static void main(String[] args) throws InterruptedException {// 共享的鎖對象Object lock = new Object();
// 線程 1Thread thread1 = new Thread(() -> {synchronized (lock) {System.out.println("Thread1: 已進入同步塊");try {for (int i = 0; i < 5; i++) {System.out.println("Thread1: 迭代 " + i);Thread.sleep(3000); // 睡眠3000毫秒}} catch (InterruptedException e) {System.out.println("Thread1: 被中斷");}System.out.println("Thread1: 已退出同步塊");}},"T1");// 線程 2Thread thread2 = new Thread(() -> {synchronized (lock) {System.out.println("Thread2: 已進入同步塊");try {for (int i = 0; i < 5; i++) {System.out.println("Thread2: 迭代 " + i);Thread.sleep(3000); // 睡眠 3000 毫秒}} catch (InterruptedException e) {System.out.println("Thread2: 被中斷");}System.out.println("Thread2: 已退出同步塊");}},"T2");// 啟動兩個線程thread1.start();thread2.start();// 主線程等待兩個子線程完成try {thread1.join();thread2.join();} catch (InterruptedException e) {System.out.println("Main: 在等待子線程完成時被中斷");}}
}

代碼解釋

共享鎖對象:

Object lock = new Object(); 定義了一個共享的鎖對象,用于在多個線程之間同步。

線程創建:

創建了兩個線程 thread1 和 thread2,它們都將嘗試獲取鎖 lock。
在 synchronized (lock) 塊內,線程將執行一個循環,睡眠500毫秒,模擬執行任務。

啟動線程:

thread1.start(); 和 thread2.start(); 啟動了兩個線程,讓它們競爭鎖 lock。
主線程等待:
thread1.join();和thread2.join(); 確保主線程在等待兩個子線程完成后再退出。

在這里插入圖片描述

2.5. 等待狀態(Waiting)

WAITING 狀態是無限等待狀態,直到被其他線程喚醒。

public class Dom14 {public static void main(String[] args) throws InterruptedException {Thread t=new Thread(()->{while (true){//System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new NullPointerException();}}});t.start();//join() 會出現WAITING狀態  --死等t.join();System.out.println(t.getState());}
}

通過控制臺觀察不到,因為出現了死等所以,所以jconsole進行觀察:
在這里插入圖片描述

阻塞狀態與等待狀態的區別

在這里插入圖片描述


2.6 等待狀態(TIMED_WAITING)

TIMED_WAITING 狀態是有限等待狀態,線程會在指定時間后自動退出。

public class Dom13 {public static void main(String[] args) throws InterruptedException {Thread t=new Thread(()->{while (true){//System.out.println("hello thread");try {Thread.sleep(1000);} catch (InterruptedException e) {throw new NullPointerException();}}});t.start();Thread.sleep(100);//指定時間的阻塞 TIMED_WAITING 狀態System.out.println(t.getState());//join(時間)也會進入TIMED_WAITING 狀態t.join(100);System.out.println(t.getState());}
}

在這里插入圖片描述

2.7終止狀態(TERMINATED)

  • 線程完成執行或 debido a una interrupción external? 執行結束。
  • 一旦線程終止,其資源會被操作系統回收。

TERMINATED: 工作完成了.

public class Dom11 {public static void main(String[] args) throws InterruptedException {Thread t=new Thread(()->{System.out.println("hello thread");});t.start();Thread.sleep(1000);//內核當中的線程已經結束了(工作結束了)System.out.println(t.getState());}
}

在這里插入圖片描述


二、線程狀態的轉換

線程狀態之間的轉換是由操作系統的調度器和線程自身的行為決定的。以下是線程狀態轉換的常見情況:

在這里插入圖片描述
?家不要被這個狀態轉移圖嚇到,我們重點是要理解狀態的意義以及各個狀態的具體意思。在這里插入圖片描述
例子:(銀行的例子)

剛把李四、王五找來,還是給他們在安排任務,沒讓他們行動起來,就是 NEW 狀態;
當李四、王五開始去窗口排隊,等待服務,就進?到 RUNNABLE 狀態。該狀態并不表示已經被銀行工作?員開始接待,排在隊伍中也是屬于該狀態,即可被服務的狀態,是否開始服務,則看調度器的調度;
當李四、王五因為?些事情需要去忙,例如需要填寫信息、回家取證件、發呆?會等等時,進入BLOCKED 、 WATING 、 TIMED_WAITING 狀態;如果李四、王五已經忙完,為 TERMINATED 狀態。


  1. 就緒 → 運行
  • 操作系統的調度器選擇一個就緒狀態的線程,并分配 CPU 時間片。
  • 例如
    Thread thread = new Thread();
    thread.start();   
    
  1. 運行 → 就緒

    • 線程的 CPU 時間片用完,被調度器剝奪 CPU 使用權。

    - 例如:操作系統使用時間片調度,線程的時間片到期后會被暫停。

  2. 運行 → 阻塞

  • 線程在執行過程中等待某些資源(如 I/O 或鎖),主動放棄 CPU。

例如:線程嘗試獲取一個被其他線程占用的鎖:
java synchronized (lock) { //如果 lock 已被另一個線程占用,此線程將進入阻塞狀態 }

  1. 運行 → 等待
  • 線程主動調用某些方法(如 sleep()),等待特定條件滿足。

** 例如:**
java Thread.sleep(1000); //線程進入等待狀態,等待 1 秒

  1. 阻塞/等待 → 就緒
  • 阻塞狀態的線程等到所需資源可用(如鎖被釋放)。
  • 等待狀態的線程等到超時或被其他線程喚醒。
  • 例如:
    // 阻塞狀態的線程獲取鎖后會自動轉移到就緒狀態
    

三、線程安全與狀態管理

在多線程編程中,線程狀態的管理直接關系到程序的正確性和性能。以下是需要注意的事項:

  1. 避免長時間占用 CPU
  • 長時間占用 CPU 的線程會導致其他線程饑餓。
  • 建議使用 yield()sleep() 方法讓出 CPU。
  1. 合理加鎖和解鎖
  • 鎖的不當使用可能導致線程長時間阻塞。
  • 例如:在持有鎖時避免執行耗時操作。
  1. 正確使用等待/通知機制
  • 使用 wait()notify() 方法可以更高效地管理線程間的協作。
  • 例如:實現生產者-消費者模式時,使用等待隊列管理線程狀態。

四、總結

在本文中,我們將通過JConsole這款強大的工具,深入探索Java多線程的核心知識。從線程的基本狀態(如新建、就緒、運行、阻塞、等待和終止)到線程狀態之間的轉換機制,幫助開發者更好地理解和管理線程。通過實踐性的教程,讀者將學會如何利用JConsole監控和調試線程,從而優化應用程序的性能和穩定性。這篇文章適合Java開發人員和對并發編程感興趣的學習者,旨在提供一份清晰易懂的指南,助力在多線程編程中游刃有余

如果您需要更深入的內容或具體案例,可以在留言區告訴我!

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

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

相關文章

基于django優秀少兒圖書推薦網(源碼+lw+部署文檔+講解),源碼可白嫖!

摘要 時代在飛速進步&#xff0c;每個行業都在努力發展現在先進技術&#xff0c;通過這些先進的技術來提高自己的水平和優勢&#xff0c;圖書推薦網當然不能排除在外。本次開發的優秀少兒圖書推薦網是在實際應用和軟件工程的開發原理之上&#xff0c;運用Python語言、爬蟲技術…

《網絡管理》實踐環節01:OpenEuler22.03sp4安裝zabbix6.2

蘭生幽谷&#xff0c;不為莫服而不芳&#xff1b; 君子行義&#xff0c;不為莫知而止休。 1 環境 openEuler 22.03 LTSsp4PHP 8.0Apache 2Mysql 8.0zabbix6.2.4 表1-1 Zabbix網絡規劃&#xff08;用你們自己的特征網段規劃&#xff09; 主機名 IP 功能 備注 zbx6svr 19…

Axure項目實戰:智慧城市APP(七)我的、消息(顯示與隱藏交互)

親愛的小伙伴&#xff0c;在您瀏覽之前&#xff0c;煩請關注一下&#xff0c;在此深表感謝&#xff01; 課程主題&#xff1a;智慧城市APP 主要內容&#xff1a;我的、消息、活動模塊頁面 應用場景&#xff1a;消息頁設計、我的頁面設計以及活動頁面設計 案例展示&#xff…

晶晨S905L3A(B)-安卓9.0-開啟ADB和ROOT-支持IPTV6-支持外置游戲系統-支持多種無線芯片-支持救磚-完美通刷線刷固件包

晶晨S905L3A(B)-安卓9.0-開啟ADB和ROOT-支持IPTV6-支持外置游戲系統-支持多種無線芯片-支持救磚-完美通刷線刷固件包 適用型號&#xff1a;M401A、CM311-1a、CM311-1sa、B863AV3.1-M2、B863AV3.2-M、UNT403A、UNT413A、M411A、E900V22C、E900V22D、IP112H等等晶晨S905L3A(B)處…

【免費】2007-2019年各省地方財政科學技術支出數據

2007-2019年各省地方財政科學技術支出數據 1、時間&#xff1a;2007-2019年 2、來源&#xff1a;國家統計局、統計年鑒 3、指標&#xff1a;行政區劃代碼、地區、年份、地方財政科學技術支出 4、范圍&#xff1a;31省 5、指標說明&#xff1a;地方財政科學技術支出是指地方…

樹形結構的工具類TreeUtil

這個地方是以null為根節點&#xff0c;相關以null或者0自己在TreeUtil中加代碼&#xff0c;就行 基礎類 package com.jm.common.entity;import lombok.Data;import java.util.ArrayList; import java.util.List;/*** Author:JianWu* Date: 2025/3/26 9:02*/ Data public clas…

視頻聯網平臺智慧運維系統:智能時代的城市視覺中樞

引言&#xff1a;破解視頻運維的"帕累托困境" 在智慧城市與數字化轉型浪潮中&#xff0c;全球視頻監控設備保有量已突破10億臺&#xff0c;日均產生的視頻數據量超過10萬PB。然而&#xff0c;傳統運維模式正面臨三重困境&#xff1a; 海量設備管理失序&#xff1a;…

DeepSeek 助力 Vue3 開發:打造絲滑的表格(Table)之添加行拖拽排序功能示例9,TableView16_09 嵌套表格拖拽排序

前言:哈嘍,大家好,今天給大家分享一篇文章!并提供具體代碼幫助大家深入理解,徹底掌握!創作不易,如果能幫助到大家或者給大家一些靈感和啟發,歡迎收藏+關注哦 ?? 目錄 DeepSeek 助力 Vue3 開發:打造絲滑的表格(Table)之添加行拖拽排序功能示例9,TableView16_09 嵌…

QML中使用Image顯示圖片和使用QQuickItem顯示圖片

在QML中顯示圖片時&#xff0c;Image元素和自定義QQuickItem有不同的特性和適用場景。以下是兩者的詳細對比及性能分析&#xff1a; 1. Image 元素 優點&#xff1a; 聲明式語法&#xff1a;簡單直觀&#xff0c;適合靜態圖片或簡單動態需求 Image {source: "image.png&…

【力扣刷題|第十七天】0-1 背包 完全背包

目標和 力扣題目網址:目標和 這道題我們先用回溯的思想來做。首先我們設正數和為S&#xff0c;數組和為N&#xff0c;目標值為T&#xff0c;那么S-(N-S)T化簡之后可以得S(TN)/2即選擇的正數個數為偶數&#xff0c;而且NT也為偶數&#xff0c;那么第一個判斷條件我們就有了&…

【Linux網絡與網絡編程】01.初識網絡

一、計算機網絡的發展歷史 計算機是人的工具&#xff0c;人要協同工作&#xff0c;注定了網絡的產生是必然的。 二、協議 計算機之間的傳輸媒介是光信號和電信號&#xff0c;通過 "頻率" 和 "強弱" 來表示 0 和 1 這樣的信息&#xff0c;要想傳遞各種不同…

使用 Python 進行鏈上數據監控:讓區塊鏈數據觸手可及

使用 Python 進行鏈上數據監控:讓區塊鏈數據觸手可及 區塊鏈技術正以前所未有的速度改變著各行各業,特別是在金融、供應鏈、物聯網和智能合約等領域的應用,已經成為了一種新常態。然而,隨著區塊鏈網絡的快速擴展和去中心化特性的不斷強化,數據的可視化與監控變得愈發重要…

【SMBIOS數據塊類型列表】

SMBIOS數據塊類型列表 SMBIOS數據塊類型列表**SMBIOS 數據塊類型列表****如何查看實際的 SMBIOS 數據塊&#xff1f;****總結** SMBIOS數據塊類型列表 在 SMBIOS&#xff08;System Management BIOS&#xff09;中&#xff0c;Type 是用來標識不同類型的數據塊的。每種類型對應…

【測試】每日3道面試題 3/30

每日更新&#xff0c;建議關注收藏點贊。 白盒測試邏輯覆蓋標準&#xff1f;哪種覆蓋標準覆蓋率最高&#xff1f; 5種。語句覆蓋、分支/判定覆蓋、條件覆蓋、條件組合覆蓋【覆蓋率最高&#xff0c;所有可能條件組合都驗證】、路徑覆蓋【理論上最高&#xff0c;但實際很難實現】…

NFS掛載異常排查記錄

互相PING服務器看是否通&#xff1b;在ubuntu下看下服務器是否正常運行。導出目錄是否導出了。最后發現在掛載目錄的地方目錄路徑和后面沒有加空格。

1--當「窮舉」成為藝術:CTF暴力破解漏洞技術從入門到入刑指南(知識點講解版)

當「窮舉」成為藝術&#xff1a;CTF暴力破解漏洞技術從入門到入刑指南 引言&#xff1a;論暴力破解的哲學意義 “世界上本沒有漏洞&#xff0c;密碼設得簡單了&#xff0c;便成了漏洞。” —— 魯迅&#xff08;并沒有說過&#xff09; 想象你是個不會撬鎖的小偷&#xff0c;面…

Java實戰:實現用戶的登錄注冊功能

系列文章目錄 Java文件 I/O流的操作實戰和高級UI組件和事件監聽的綜合 文章目錄 系列文章目錄前言一、大致流程思路分析&#xff1a;二、定義用戶類&#xff1a;三、服務層的實現&#xff1a; 1.保護用戶數據功能的實現2.登錄操作的實現 四、實現用戶的注冊界面&#xff1a; 大…

SQLAlchemy 支持特殊字符

postgresql 實踐 pydantic 實踐&#xff08;一&#xff09;基礎 pydantic 實踐&#xff08;二&#xff09;數據校驗 SQLAlchemy 介紹與實踐 SQLAlchemy 支持特殊字符 SQLAlchemy 支持特殊字符 1. 字符集介紹分析2. MySQL 支持特殊字符2.1. 更新 MySQL 字符集為 utf8mb42.2 更新…

如何看待職場中的“向上管理”

向上管理的本質,是提供一份更精確的人力產品說明書, 利用市場的邏輯,引導領導,按照你的心意,使用你這款產品。 公司獲得更高的產出,領導獲得更多的成果,你獲得了自由支配的時間, 這是一場正和博弈。 ? 圖片來源:網絡 (1)具體案例: 把自己當成一款產品,使用者…

AIOHTTP

文章目錄 AIOHTTP主要特點庫安裝在一個命令中安裝所有加速 入門客戶端示例服務器示例&#xff1a; 開發模式aiohttp 3 有什么新功能&#xff1f;依賴關系 客戶端快速入門發起請求在 URL 中傳遞參數響應內容和狀態碼二進制響應內容JSON 請求 注意JSON 響應內容流式響應內容更復雜…