Java 线程的几种状态

目录

一.线程状态(6种)

1.1.NEW(初始状态)

1.2.RUNNABLE (运行状态)

1.3.TIMED_WAITING(限时阻塞状态)

1.4.BLOCKED(阻塞状态)

1.5.WAITING(等待状态)

1.6.TERMINATED(终止状态)

二.状态之间的切换条件


一.线程状态(6种)

1.NEW 2.RUNNABLE 3.TIMED_WAITING 4.BLOCKED 5.WAITING 6.TERMINATED

调用Thread类的getState()方法可以获取当前线程的状态

1.1.NEW(初始状态)

当前线程被创建,但是还没有调用start()方法启动线程

java 复制代码
public class Demo5 {
    public static void main(String[] args) {
        Thread t1=new Thread(()->
        {
            System.out.println("t1线程启动");
        });
        System.out.println(t1.getState());
        t1.start();
    }

}

1.2.RUNNABLE (运行状态)

将线程正在CPU上运行或者线程已经准备就绪,随时可以去CPU 上运行的状态成为运行状态

java 复制代码
package Thread;


public class Demo5 {
    public static void main(String[] args) {
        Thread t1=new Thread(()->
        {
            while(true) {
                System.out.println("my thread");
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        System.out.println(t1.getState());
        t1.start();
        System.out.println(t1.getState());
    }

}

1.3.TIMED_WAITING(限时阻塞状态)

指定时间的阻塞(具有时间限定)如:

sleep(long millis)join(long millis)等

1.4.BLOCKED(阻塞状态)

当线程试图获取一个被其他线程持有的锁时,线程进入阻塞状态。此时,线程无法继续执行,直到获得所需的锁。

java 复制代码
public class Demo6 {

    public static void main(String[] args) {
        Object locker=new Object();
        Thread t1=new Thread(()->{
            synchronized (locker){
                System.out.println("hello t1");
                try {
                    Thread.sleep(400000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        Thread t2=new Thread(()->{
            synchronized (locker){
                System.out.println("hello t2");
            }
        });
        t1.start();
        t2.start();
    }
}

jconsole 可以来查看线程状态

可以看到线程t2被是阻塞状态,因为线程t2执行需要的锁被线程t1占用了。

1.5.WAITING(等待状态)

死等,不加时间的等待,直到被其他线程主动唤醒 join()/wait()

java 复制代码
public class Demo7 {
    public static void main(String[] args) throws InterruptedException {
        Object locker=new Object();
        Thread t1=new Thread(()->
        {
            synchronized (locker){
                try {
                    locker.wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        t1.start();
        Thread.sleep(1000);
        System.out.println(t1.getState());
    }
}

1.6.TERMINATED(终止状态)

线程工作已经完成了,内核中的线程已经结束了,但Thread对象依旧存在,因为进程还没有结束,进程结束后,JVM会自动回收对象

java 复制代码
public class Demo8 {
    public static void main(String[] args) throws InterruptedException {
        Thread t1=new Thread(()->
        {
            for (int i = 0; i < 3; i++) {
                System.out.println("haha");
            }
            System.out.println("t1线程已结束");
        });
        t1.start();
        t1.join();
        System.out.println(t1.getState());
    }
}

二.状态之间的切换条件

线程状态到这里就结束了,下一篇我将讲述线程安全的问题

相关推荐
晚风醉蝶18 分钟前
1-11-奇偶排序-OddEvenSort
java·数据结构·算法
夏天拐跑了西瓜42 分钟前
Spring Cloud 微服务实战(三):一个服务挂了,凭什么拖垮整个系统?Sentinel 限流熔断实战
java·spring cloud·微服务
CRMEB定制开发1 小时前
2026年最值得推荐的10大开源商城系统盘点
开发语言·人工智能·开源·商城系统·小程序商城
2601_967264281 小时前
Jetpack Compose 实践指南:从入门到进阶
java·学习
buhuizhiyuci1 小时前
【QT-百日筑基篇】修真世界摸爬滚打多年,终于黄天不负有心人,突破炼器中期——常用控件QWight的属性
开发语言·c++·qt·gui·图形化
m0_587383002 小时前
社区家政系统开发实战:从需求分析到上线部署全指南
java·spring boot·spring·需求分析
凤山老林2 小时前
动态 i18n 体系落地:Spring Boot 多租户热加载与前后端协同实践
java·spring boot·后端·i18n
白露与泡影2 小时前
解密 Pi 的 Harness 工程:Agent 会话如何实现持久化与恢复
java·人工智能·算法
Littlehero_1213 小时前
QT自定义控件之热换站系统(源码开源)
开发语言·qt
meilindehuzi_a3 小时前
Python 基础语法(1):常量、变量、类型、输入输出与运算符
开发语言·python