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.mzph.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 响应内容流式响应内容更复杂…