在程序运行过程中,线程的状态是什么?进来看看就通透了

简介: 在程序运行过程中,线程的状态是什么?进来看看就通透了

一、观察线程的所有状态

话不多说,我们先来看看线程都有哪些状态:

线程的状态是一个枚举类型 Thread.State

public class Demo4 {
    public static void main(String[] args) {
        for (Thread.State state :Thread.State.values()) {
            System.out.println(state);
        }
    }
}

那么通过上面这个简单的测试程序,根据运行结果,我们就可以看到在程序运行过程中,线程可能会出现的所有状态:

问题来了,这些状态的意义是什么呢?下面我们来看:

new

安排了工作还未开始行动

runnable

可工作的又可以分成正在工作中和即将开始工作

blocked

表示排队等着其他事情,因为锁产生阻塞

waiting

表示排队等着其他事情,调用wait产生阻塞

timed_waiting

表示排队等着其他事情,由sleep或join()产生阻塞

terminated

工作完成了

1.1 观察NEW状态

public class Test_NEW_State {
    public static void main(String[] args) {
        Thread t = new Thread(()->{
            while (true){
                //System.out.println("hello thread!!");
            }
        });
        System.out.println("当前状态:>"+t.getState());//获取当前线程状态
         t.start();
    }
}

在上面的代码中,在start(线程开始)之前获取状态,意味着当前状态只是被安排了工作,但是还未开始行动,因此就是NEW状态:

1.2 观察TERMINATED状态

public class Test_TREMINATED_State {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(()->{
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        System.out.println("未安排工作时状态:>"+t.getState());
        t.start();
        t.join();//等待进程执行完成
        System.out.println("等待线程执行结束后:>"+t.getState());
    }
}

在上面的代码中,创建线程后,先获取当前线程的状态,因为此时还没有start,所以未安排工作时的线程状态就是:NEW。而执行t.join()等待线程执行结束,我们得到的线程状态就是TREMINATED。

1.3 观察RUNNABLE状态

public class Test_RUNNABLE_State {
    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(()->{
            while (true){
                //什么都不干
            }
        });
        System.out.println("start之前:>"+t.getState());
        t.start();
        Thread.sleep(1000);
        System.out.println("线程开始(准备)执行后:>"+t.getState());
    }
}

在上面的代码中,依然是在start之前获取线程的状态,毫无疑问肯定是NEW,在线程休眠1000ms后,再次获取线程状态,此时就是就绪(执行)状态了。

就绪状态,可以理解成两种情况:>

  • 线程正在CPU上运行。
  • 线程在这里排队,随时都可以去CPU上执行。

1.4 观察WAITING BLOCKED TIMED_WAITING 状态的转换

public class Test_State {
    public static void main(String[] args) {
        final Object object = new Object();
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (object){
                    while (true){
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        },"t1");
        t1.start();
        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (object){
                    System.out.println("hello");
                }
            }
        },"t2");
        t2.start();
    }
}

使用 jconsole 可以看到 t1 的状态是 TIMED_WAITING , t2 的状态是 BLOCKED。

修改上面的代码, t1 中的 sleep 换成 wait

public class Test_State1 {
    public static void main(String[] args) {
        final Object object = new Object();
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (object){
                    try {
                        object.wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        },"t1");
        t1.start();
    }
}

使用 jconsole 可以看到 t1 的状态是 WAITING

结论:

  • BLOCKED 表示等待获取锁, WAITING TIMED_WAITING 表示等待其他线程发来通知.
  • TIMED_WAITING 线程在等待唤醒,但设置了时限; WAITING 线程在无限等待唤醒

 


🌈🌈🌈好啦,今天的分享就到这里!

🛩️🛩️🛩️希望各位看官读完文章后,能够有所提升。

🎉🎉🎉创作不易,还希望各位大佬支持一下!

✈️✈️✈️点赞,你的认可是我创作的动力!

⭐⭐⭐收藏,你的青睐是我努力的方向!

✏️✏️✏️评论:你的意见是我进步的财富!

 

目录
相关文章
|
2月前
|
缓存 负载均衡 安全
在Python中,如何使用多线程或多进程来提高程序的性能?
【2月更文挑战第17天】【2月更文挑战第50篇】在Python中,如何使用多线程或多进程来提高程序的性能?
|
2月前
|
人工智能 Java API
Python 潮流周刊#28:两种线程池、四种优化程序的方法
Python 潮流周刊#28:两种线程池、四种优化程序的方法
39 1
|
6天前
|
存储 Java C++
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据
Java虚拟机(JVM)管理内存划分为多个区域:程序计数器记录线程执行位置;虚拟机栈存储线程私有数据,如局部变量和操作数;本地方法栈支持native方法;堆存放所有线程的对象实例,由垃圾回收管理;方法区(在Java 8后变为元空间)存储类信息和常量;运行时常量池是方法区一部分,保存符号引用和常量;直接内存非JVM规范定义,手动管理,通过Buffer类使用。Java 8后,永久代被元空间取代,G1成为默认GC。
18 2
|
13天前
|
Java 程序员
Java多线程编程是指在一个进程中创建并运行多个线程,每个线程执行不同的任务,并行地工作,以达到提高效率的目的
【6月更文挑战第18天】Java多线程提升效率,通过synchronized关键字、Lock接口和原子变量实现同步互斥。synchronized控制共享资源访问,基于对象内置锁。Lock接口提供更灵活的锁管理,需手动解锁。原子变量类(如AtomicInteger)支持无锁的原子操作,减少性能影响。
21 3
|
11天前
|
Java 调度
【实战指南】Java多线程高手秘籍:线程生命周期管理,掌控程序命运的钥匙!
【6月更文挑战第19天】Java多线程涉及线程生命周期的五个阶段:新建、就绪、运行、阻塞和死亡。理解这些状态转换对性能优化至关重要。线程从新建到调用`start()`变为就绪,等待CPU执行。获得执行权后进入运行状态,执行`run()`。遇到阻塞如等待锁时,进入阻塞状态。完成后或被中断则死亡。管理线程包括合理使用锁、利用线程池、处理异常和优雅关闭线程。通过控制这些,能编写更高效稳定的多线程程序。
|
11天前
|
Java
【技术解码】Java线程的五味人生:新建、就绪、运行、阻塞与死亡的哲学解读!
【6月更文挑战第19天】Java线程生命周期如同人生旅程,经历新建、就绪、运行、阻塞至死亡五阶段。从`new Thread()`的诞生到`start()`的蓄势待发,再到`run()`的全力以赴,线程在代码中奔跑。阻塞时面临挑战,等待资源释放,最终通过`join()`或中断结束生命。线程的每个状态转变,都是编程世界与哲思的交汇点。
|
19天前
|
并行计算 算法 C#
C# Mandelbrot和Julia分形图像生成程序更新到2010-9-14版 支持多线程计算 多核处理器
此文档是一个关于分形图像生成器的介绍,作者分享了个人开发的M-J算法集成及色彩创新,包括源代码和历史版本。作者欢迎有兴趣的读者留言交流,并提供了邮箱(delacroix_xu@sina.com)以分享资源。文中还展示了程序的发展历程,如增加了真彩色效果、圈选放大、历史记录等功能,并分享了几幅精美的分形图像。此外,还提到了程序的新特性,如导入ini文件批量输出图像和更新一批图片的功能。文档末尾附有多张程序生成的高分辨率分形图像示例。
|
25天前
|
Java 调度 流计算
基于多线程的方式优化 FLink 程序
这篇内容介绍了线程的基本概念和重要性。线程是程序执行的最小单位,比进程更细粒度,常用于提高程序响应性和性能。多线程可以实现并发处理,利用多核处理器,实现资源共享和复杂逻辑。文章还讨论了线程的五种状态(NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED)以及如何在Java中创建和停止线程。最后提到了两种停止线程的方法:使用标识和中断机制。
|
3天前
|
开发框架 安全 .NET
程序技术好文:进程和线程的区别
程序技术好文:进程和线程的区别
|
6天前
|
Java
java使用多线程编写服务端与客户端文件上传程序
java使用多线程编写服务端与客户端文件上传程序
9 0