线程的状态

1.线程状态的种类

  • NEW:Thread 对象有了,调用 start系统内部的线程还未创建。
  • RUNNABLE:指的是,这个线程"随叫随到"。
    a)这个线程正在 CPU 上执行
    b)这个线程虽然没在 CPU 上执行,随时可以调度到 CPU 上执行
  • BLOCKED:进行锁竞争的时候产生的阻塞(本文暂不涉及)
  • WAITING:死等进入阻塞状态
  • TIMED_WAITING:超时等待进入阻塞状态
  • TERMINATED:线程已经终止了(内核中的线程已经销毁了,Thread 对象还在)

 2.线程每种状态之间的关系

 1.NEW状态

     public static void main(String[] args) {
        Thread t=new Thread(()->{
            System.out.println("tjchs");
        });
        System.out.println(t.getState());
        t.start();
    }

2.RUNNABLE状态

还是原来那个代码,只不过多加了一行,运行结果就不一样了 

     public static void main(String[] args) throws InterruptedException {
        Thread t=new Thread(()->{
            System.out.println("tjchs");
        });
        System.out.println(t.getState());
        t.start();
        System.out.println(t.getState());
    }

 

可以看到t线程start之前其实有个RUNNALE状态,然后立马就执行了。(就像是跑步比赛,开跑前都要处于一个起跑的就绪状态,信号枪一响就立马跑起来)

3.TERMINATED状态

在上个代码的基础上加了个t.join(为了保证t线程已经执行完),可以看到线程处于TERMINATED(终止)状态。

    public static void main(String[] args) throws InterruptedException {
        Thread t=new Thread(()->{
            System.out.println("tjchs");
        });
        System.out.println(t.getState());
        t.start();
        t.join();
        System.out.println(t.getState());
    }

4. WAITING状态

    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {
            while (true) {
                System.out.println("tjchs");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        t.start();
        t.join();
       
    }

 这个状态从代码结果不是很好看出来,需要借助jconsole这个工具来看

如何通过jconsole看线程状态: 

 1.根据路径找到jconsole.exe

 

 2.选择当前运行的线程,然后点连接

3.会出现一个新的框,点击 不安全的连接

4.选择线程,点击main可看到当前线程状态的文字描述

可以看到这个 

此时线程处于WAITING(死等)状态 

5. TIMED_WAITING状态 

    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(() -> {
            while (true) {
                System.out.println("tjchs");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        t.start();
        t.join(3600*1000);
    }

 重复之前的步骤,可以看到此时线程处于TIMED_WAITING状态 

总结:

线程之间每种状态的关系大致如此 

 

相关推荐

  1. c++ 线几种状态

    2024-04-27 21:36:05       45 阅读
  2. C#中线和Apartment状态

    2024-04-27 21:36:05       43 阅读
  3. 线(3)线基本状态

    2024-04-27 21:36:05       45 阅读
  4. 基础 | 并发编程 - [线状态]

    2024-04-27 21:36:05       43 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-27 21:36:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-27 21:36:05       100 阅读
  3. 在Django里面运行非项目文件

    2024-04-27 21:36:05       82 阅读
  4. Python语言-面向对象

    2024-04-27 21:36:05       91 阅读

热门阅读

  1. OpenInventor/Coin3D 学习指南

    2024-04-27 21:36:05       31 阅读
  2. go自编自导自写一片协成池

    2024-04-27 21:36:05       29 阅读
  3. undo log和redo log区分

    2024-04-27 21:36:05       34 阅读
  4. LeetCode-101-对称二叉树

    2024-04-27 21:36:05       25 阅读
  5. Android 14 transtion 动画流程

    2024-04-27 21:36:05       29 阅读
  6. Redis中transactions命令详解

    2024-04-27 21:36:05       25 阅读
  7. QT C++ QCustomPlot 简单使用

    2024-04-27 21:36:05       29 阅读