Java EE——线程状态

前言

从编写Java代码的角度来说,线程一共有六种状态;但是以操作系统的视角来看,线程状态可以分为物种

六种划分

调用getState()方法获取当前线程状态

一.NEW

定义:线程(对象)被创建但还没有启动

java 复制代码
public class NEW {
    public static void main(String[] args) {
        Thread thread = new Thread(()->{});
        //thread创建完毕
        //NEW
        System.out.println(thread.getState());
    }
}

二.RUNNABLE

定义:线程创建并启动完毕,拥有执行代码的能力或者正在执行代码

java 复制代码
public class RUNNABLE {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(()->{
            while (true){
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                System.out.println("Hello Thread");
            }
        });
        //调用start
        thread.start();
        //RUNNABLE
        System.out.println(thread.getState());
    }
}

三.WAITING

定义:线程处于等待状态,等待其他线程执行完毕(join)或者其他线程来唤醒(notify)

java 复制代码
public class WAITING {
    public static void main(String[] args) throws InterruptedException {
        Object locker = new Object();
        Thread thread = new Thread(()->{
            synchronized (locker){
                try {
                    //无时间参数的wait
                    locker.wait();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });
        thread.start();
        Thread.sleep(100);
        //WAITING
        System.out.println(thread.getState());
    }
}

四.TIMED_WAITING

定义:线程处于等待状态

复制代码
    等待其他线程执行完毕(join)
复制代码
    其他线程来唤醒(notify)
复制代码
    等待一定的时间后自动唤醒
java 复制代码
public class TIMED_WAITING {
    public static void main(String[] args) throws InterruptedException {
        Object locker = new Object();
        Thread thread = new Thread(()->{
            synchronized (locker){
                try {
                    //有时间参数的wait
                    locker.wait(10000000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });
        thread.start();
        Thread.sleep(100);
        //
        System.out.println(thread.getState());
    }
}

五.BLOCKED

定义:线程竞争锁对象失败进入BLOCKED(锁竞争)状态

java 复制代码
public class BLOCKED {
    public static void main(String[] args) throws InterruptedException {
        Object locker = new Object();
        Thread thread1 = new Thread(()->{
            synchronized (locker){
                try {
                    Thread.sleep(1000000);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }
        });
        thread1.start();
        //thread1先拿到locker锁对象
        Thread thread2 = new Thread(()->{
            while (true) {
                synchronized (locker) {
                    System.out.println("Hello Thread2");
                }
            }
        });
        thread2.start();
        //sleep(1000)的作用是让thread2有足够用的时间执行到synchronized
        Thread.sleep(100);
        //获取线程状态
        //BLOCKED
        System.out.println(thread2.getState());
    }
}

六.TERMINATED

定义:线程执行完毕或者因异常退出

java 复制代码
public class TERMINATED {
    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(()->{});
        thread.start();
        //等待线程执行完毕
        thread.join();
        //TERMINATED
        System.out.println(thread.getState());
    }
}

五种划分

一.新建

和NEW一样

二.就绪

CPU已经为线程分配好了时间,但还没来得及执行代码

三.运行

CPU已经为线程分配好了时间,并且正在执行代码

四.阻塞

线程启动完毕,但被暂停执行(可能是自身原因,也可能是外部原因),有以下几种情况

1.等待其他线程释放锁对象

2.等待文件IO,如

3.调用wait(无参数/有参数)方法

五.终止

和TERMINATED一样,线程执行完毕或者被强制终止

相关推荐
Sweet锦43 分钟前
不调 Python,不装向量库:我用纯 Java 写了一套以图搜图引擎
java·人工智能·开源·图搜索
五彩小白1 小时前
自回归和上下文
android
如意猴1 小时前
【C++】007 C/C++ 内存管理机制、malloc与new的区别及模板初阶
java·c++·算法
可乐鸡翅yeah_1 小时前
HLS 分片过期清理,直播旧 TS 分片磁盘爆满问题处理
java·后端·spring·m3u8·m3u8在线·音视频在线播放
专业程序开发源2 小时前
SSM校园拍摄交流服务平台36936-计算机课程设计、毕业设计
java·spring boot·后端·python·elasticsearch·php·课程设计
用户094248568032 小时前
第23章:OpenJDK逃逸分析、标量替换与锁优化
java·jvm
wuminyu2 小时前
LockStack在虚拟线程Mount和Unmount拷贝过程剖析
java·linux·c语言·jvm·c++
樱花落木兰2 小时前
分布式登录实战:Session 会话共享改造,Redis 存储用户登录状态
java·javascript·数据库·redis·分布式·缓存
HAHAXX82 小时前
电商RPA批量上架通用方案:一套流程如何同时跑通拼多多、抖店、淘宝和跨境平台
java·运维·rpa
\光辉岁月/2 小时前
3.java运算符
java·开发语言