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线程中的六个状态,在实际工作中调试中就可能需要打印线程状态,来查找程序中的错误。

相关推荐
code_std几秒前
保存文件到指定位置,读取/删除指定文件夹中文件
java·spring boot·后端
小许学java7 分钟前
Spring事务和事务传播机制
java·数据库·spring·事务
大学生资源网7 分钟前
基于Javaweb技术的宠物用品商城的设计与实现(源码+文档)
java·mysql·毕业设计·源码·springboot
汤姆yu9 分钟前
基于springboot的热门文创内容推荐分享系统
java·spring boot·后端
星光一影10 分钟前
教育培训机构消课管理系统智慧校园艺术舞蹈美术艺术培训班扣课时教务管理系统
java·spring boot·mysql·vue·mybatis·uniapp
lkbhua莱克瓦2413 分钟前
MySQL介绍
java·开发语言·数据库·笔记·mysql
武昌库里写JAVA15 分钟前
在iview中使用upload组件上传文件之前先做其他的处理
java·vue.js·spring boot·后端·sql
董世昌4119 分钟前
什么是事件冒泡?如何阻止事件冒泡和浏览器默认事件?
java·前端
好度26 分钟前
配置java标准环境?(详细教程)
java·开发语言
teacher伟大光荣且正确30 分钟前
关于Qt QReadWriteLock(读写锁) 以及 QSettings 使用的问题
java·数据库·qt