JavaEE——线程的状态

目录

  • 前言
  • [1. NEW](#1. NEW)
  • [2. TERMINATED](#2. TERMINATED)
  • [3. RUNNABLE](#3. RUNNABLE)
  • [4. 三种阻塞状态](#4. 三种阻塞状态)
  • 总结

前言

本篇文章来讲解线程的几种状态。在Java中,线程的状态是一个枚举类型,Thread.State。其中一共分为了六个状态。分别为:NEW,RUNNABLE,BLOCKED,WAITING,TIMED_WAITING,

TERMINATED

1. NEW

new:安排了⼯作, 还未开始⾏动

new状态表示Thread对象已经创建,但是并没有执行Start()语句

java 复制代码
public class Demo13 {
    public static void main(String[] args) {
        //观看线程的NEW状态
        Thread t = new Thread(() -> {

        });
        System.out.println(t.getState());
        t.start();
    }
}

2. TERMINATED

terminated:⼯作完成了.

就是表示线程结束的状态

java 复制代码
public class Demo13 {
    public static void main(String[] args) throws InterruptedException {
        //观看线程的NEW状态
        Thread t = new Thread(() -> {

        });
        System.out.println(t.getState());
        t.start();
        t.join();
        System.out.println(t.getState());
    }
}

3. RUNNABLE

runnable:可⼯作的. ⼜可以分成正在⼯作中和即将开始⼯作.

runnable即就绪状态

java 复制代码
public class Demo13 {
    public static void main(String[] args) throws InterruptedException {
        //观看线程的NEW状态
        Thread t = new Thread(() -> {
            while (true) {
                //什么也不做
            }
        });
        System.out.println(t.getState());
        t.start();

        System.out.println(t.getState());
        
        t.join();
        System.out.println(t.getState());
    }
}

由于内部是while死循环,main一直在等待t线程,故不会结束。

4. 三种阻塞状态

BLOCKED,WAITING,TIMED_WAITING 都表示排队等着其他事情,也就是都表示阻塞状态。但是还是有区别的,BLOCKED表示由于加锁产生的阻塞,WAITING表示无超时时间的阻塞,TIMED_WAITING表示有超时时间的阻塞。也就是说使用join()进行等待就是WAITING,使用join(time)或者使用sleep()进行等待就是 TIMED_WAITING。

下面观察WAITING和TIMED_WAITING状态。

使用一个监视器线程来观察main的状态

java 复制代码
public class Demo13 {
    public static void main(String[] args) throws InterruptedException {
        //获取main
        Thread mainThread = Thread.currentThread();
        //观看线程的NEW状态
        Thread t = new Thread(() -> {
            while (true) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        System.out.println(t.getState());
        t.start();

        System.out.println(t.getState());

        //观察使用一个监视器线程来观察main线程的状态
        Thread monitor = new Thread(()-> {
            try {
                Thread.sleep(1000);
                System.out.println(mainThread.getState());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        System.out.println("main等待前的状态:" + mainThread.getState());

        monitor.start();
        System.out.println("main线程开始等待");
        t.join();

        System.out.println(t.getState());
    }

观察TIMED_WAITING状态只需将最下面的join加入参数:

java 复制代码
public class Demo13 {
    public static void main(String[] args) throws InterruptedException {
        //获取main
        Thread mainThread = Thread.currentThread();
        //观看线程的NEW状态
        Thread t = new Thread(() -> {
            while (true) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        System.out.println(t.getState());
        t.start();

        System.out.println(t.getState());

        //观察使用一个监视器线程来观察main线程的状态
        Thread monitor = new Thread(()-> {
            try {
                Thread.sleep(1000);
                System.out.println(mainThread.getState());
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        System.out.println("main等待前的状态:" + mainThread.getState());

        monitor.start();
        System.out.println("main线程开始等待");
        t.join(5000);

        System.out.println(t.getState());
    }
}

BLOCKED状态需要对线程进行加锁,加锁操作将在后面的文章中讲到,故在此处不演示BLOCKED状态。

总结

本文章介绍了java线程中的六个状态,在实际工作中调试中就可能需要打印线程状态,来查找程序中的错误。

相关推荐
BD_Marathon2 小时前
【Flink】部署模式
java·数据库·flink
鼠鼠我捏,要死了捏5 小时前
深入解析Java NIO多路复用原理与性能优化实践指南
java·性能优化·nio
ningqw5 小时前
SpringBoot 常用跨域处理方案
java·后端·springboot
superlls5 小时前
(Redis)主从哨兵模式与集群模式
java·开发语言·redis
叫我阿柒啊7 小时前
Java全栈工程师面试实战:从基础到微服务的深度解析
java·redis·微服务·node.js·vue3·全栈开发·电商平台
hqxstudying8 小时前
mybatis过渡到mybatis-plus过程中需要注意的地方
java·tomcat·mybatis
lichkingyang8 小时前
最近遇到的几个JVM问题
java·jvm·算法
ZeroKoop8 小时前
多线程文件下载 - 数组切分,截取文件名称
java
Monly218 小时前
IDEA:控制台中文乱码
java·ide·intellij-idea
叫我阿柒啊9 小时前
从全栈开发到微服务架构:一次真实的Java面试实录
java·redis·ci/cd·微服务·vue3·springboot·jwt