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

线程的状态及其查看

目录

一. 线程的状态

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());//当前主线程正在执行, 打印RUNNABLE
        t1.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.kler.cn/a/374234.html

相关文章:

  • C++二十三种设计模式之迭代器模式
  • C# 设计模式(行为型模式):责任链模式
  • 2025第1周 | JavaScript中的正则表达式
  • 级联配准learning
  • 欧科云链研究院:ChatGPT 眼中的 Web3
  • 现代前端框架
  • ElementUI el-table 多选以及点击某一行的任意位置就勾选上
  • 【零售和消费品&厨房】厨房食材检测图像分割系统源码&数据集全套:改进yolo11-goldyolo
  • Django创建项目模块+创建映射类+视图
  • 拍拍贷鸿蒙版H5容器之路
  • axios源码分析之请求adapter
  • 【Python】实战:使用input()从键盘获取一个字符串,判断这个字符串在列表中是否存在(函数体不能使用in),返回结果为True或False
  • Mysql的行锁,改一行锁一行
  • 使用 LIBLR 解析带注释的 JSON
  • echarts地图,柱状图,折线图实战
  • ML 系列:第 18 部 - 高级概率论:条件概率、随机变量和概率分布
  • 【MyBatis源码】SqlSessionFactoryBuilder源码分析
  • 从零开始的c++之旅——C++ 类和对象(下)
  • C++学习笔记3——存储持续性、作用域和链接性
  • Web应用程序安全与风险
  • C++——String类讲解
  • Linux下的pipe函数详解
  • 干货--并发编程提高-计算CPU利用率(二十二)
  • smartconnect base_addr offset_addr
  • WPF中如何解决DataGrid的Header没有多余的一行
  • echart实现地图数据可视化