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

相关推荐
怒放吧德德2 小时前
Netty 4.2 入门指南:从概念到第一个程序
java·后端·netty
雨中飘荡的记忆4 小时前
大流量下库存扣减的数据库瓶颈:Redis分片缓存解决方案
java·redis·后端
心之语歌6 小时前
基于注解+拦截器的API动态路由实现方案
java·后端
华仔啊7 小时前
Stream 代码越写越难看?JDFrame 让 Java 逻辑回归优雅
java·后端
ray_liang7 小时前
用六边形架构与整洁架构对比是伪命题?
java·架构
Ray Liang9 小时前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
Java水解9 小时前
Java 中间件:Dubbo 服务降级(Mock 机制)
java·后端
SimonKing13 小时前
OpenCode AI辅助编程,不一样的编程思路,不写一行代码
java·后端·程序员
FastBean13 小时前
Jackson View Extension Spring Boot Starter
java·后端
Seven9714 小时前
剑指offer-79、最⻓不含重复字符的⼦字符串
java