当前位置: 首页 > news >正文

线程的状态及其查看

目录

一. 线程的状态

1. NEW状态

2. TERMINATED状态

3. RUNNABLE状态

4. BLOCKED状态

5. TIMED_WAITING状态

6. WAITING状态

二. 线程状态的查看

1. 通过jconsole查看

2. 通过idea查看


一. 线程的状态

线程共有6种状态:

1. NEW状态

该状态表示线程对象虽然创建了, 但是还没有启动线程.

public class Demo12 {public static void main(String[] args) {Thread t1 = new Thread(() -> {for (int i = 0; i < 3; i++) {System.out.println("t1");}System.out.println("t1线程执行结束");});System.out.println(t1.getState());t1.start();}
}

上述代码在t1线程启动之前就查看t1线程的状态. 所以此时打印出来的结果应该是"NEW".

 

2. TERMINATED状态

该状态表示线程对象仍然存在, 但是内核中的线程已经销毁了(内核中的线程已经执行完毕).

public class Demo12 {public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {for (int i = 0; i < 3; i++) {System.out.println("t1");}System.out.println("t1线程执行结束");});//System.out.println(t1.getState());t1.start();t1.sleep(1000);//睡眠1000ms, 保证线程执行结束System.out.println(t1.getState());}
}

上述代码在t1线程启动之后查看线程状态, 此时虽然线程对象还在, 但是内核中的线程结束. 所以打印出的状态就是"TERMINATED".  

3. RUNNABLE状态

该状态表示"就绪状态", 即: 当前线程正在CPU上运行或者可以随时调度到CPU上执行.

public class Demo12 {public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {for (int i = 0; i < 3; i++) {System.out.println("t1");}System.out.println("t1线程执行结束");});//System.out.println(t1.getState());t1.start();Thread mainThread = Thread.currentThread();System.out.println(mainThread.getState());//当前主线程正在执行, 打印RUNNABLEt1.sleep(1000);//睡眠1000ms, 保证线程执行结束//System.out.println(t1.getState());}
}

上述代码在main线程运行时获取main线程对象并查看这个线程的状态, 则线程的状态为RUNNABLE.

 

4. BLOCKED状态

因为锁竞争引起的阻塞. 锁是线程安全问题中的概念, 会在后面的文章中介绍.

5. TIMED_WAITING状态

有超时时间的等待状态. 例如: sleep(), join(millis).

public class Demo13 {public static void main(String[] args) throws InterruptedException {Thread mainThread = Thread.currentThread();Thread t = new Thread(() -> {while (true) {try {System.out.println("main state=" + mainThread.getState());Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});System.out.println(t.getState());t.start();// 由于 t 线程是持续 while 循环, 因此 join 不会返回.// 观察主线程的状态, 就能看到 waiting.t.join(3000);// System.out.println(t.getState());}
}

 上述结果查看main线程因为t.join(3000)而等待时的状态. 运行结果如下:

6. WAITING状态

没有超时时间的等待状态. 例如: join(), wait()

public class Demo13 {public static void main(String[] args) throws InterruptedException {Thread mainThread = Thread.currentThread();Thread t = new Thread(() -> {while (true) {try {System.out.println("main state=" + mainThread.getState());Thread.sleep(1000);} catch (InterruptedException e) {throw new RuntimeException(e);}}});System.out.println(t.getState());t.start();// 由于 t 线程是持续 while 循环, 因此 join 不会返回.// 观察主线程的状态, 就能看到 waiting.t.join();// System.out.println(t.getState());}
}

上述结果查看main线程因为t.join()而等待时的状态. 运行结果如下:

 

 

二. 线程状态的查看

1. 通过jconsole查看

我们先找到自己安装JDK的目录, 然后找到bin文件夹.

打开bin文件夹, 找到jconsole.exe 并打开.

 

 打开之后, 点击连接本地进程.

点进来之后, 选择线程这一栏, 就能看到我们电脑上本地的进程.

 

其中, Thread-0 和Thread-1 是我们自己创建的线程. 

点开其中一个线程, 就可以查看其各种属性和堆栈跟踪. 

[注]: 如果我们忘记了JDK的安装地址, 可以通过 idea -> File -> Project Structure -> SDKs -> JDK home path 查看.

 

2. 通过idea查看

在idea中, 我们也可以通过Debug调试代码, 在调试框中查看线程信息.


http://www.mrgr.cn/news/62995.html

相关文章:

  • HTML、JavaScript和CSS实现注册页面设计
  • (转)VUE3——shallowReactive 与 shallowRef详解
  • 拍拍贷鸿蒙版H5容器之路
  • 基于SSM+小程序的旅游社交登录管理系统(旅游4)
  • vue vxeui 上传组件 vxe-upload 全局配置上传方法,显示上传进度,最完美的配置方案
  • 揭秘PyInstaller:Python应用打包的瑞士军刀
  • 入门 | Kafka数据使用vector消费到Loki中使用grafana展示
  • 【Canal 中间件】Canal使用原理与基本组件概述
  • 优雅的LUA数据记录方法-serpent序列化+LUA Table
  • 2023 年 Github 万圣节彩蛋
  • windows C#-类型系统(下)
  • NLP segment-01-聊一聊分词 AI 的基础
  • street gaussion 耗时分析
  • 数据结构作业day4
  • pyecharts地图类型
  • 暴力破解漏洞
  • node.js_npm : 无法加载文件 D:\Program Files\nodejs\npm.ps1
  • [java][高级]FilterListenerAjax
  • 双瑞股份上会,业绩增速放缓,与部分供应商交易合理性不足
  • 使用 MMDetection 实现 Pascal VOC 数据集的目标检测项目练习(四) annaconda和pytorch
  • Unity DOTS
  • 防爆电机技术要点、选型,一文搞定!
  • 必应Bing国内搜索广告代理商,必应广告如何开户投放?
  • STM32--STM32 微控制器详解
  • 基于Java的茶产品销售平台系统【附源码】
  • 假设检验简介