三、线程的状态

3.1 观察线程的所有状态

java 复制代码
package demo01;

public class ThreadState {
    public static void main(String[] args) {
        for (Thread.State state : Thread.State.values()) {
            System.out.println(state);
        }
    }
}
  1. NEW(新建) - 一个新创建但还未启动的线程处于这个状态。也就是说,当使用new关键字创建了Thread对象后,但在调用其start()方法之前,该线程就处于NEW状态。

  2. RUNNABLE(可运行/运行中) - 当调用了线程的start()方法后,线程进入RUNNABLE状态。这意味着线程正在JVM中执行或者正准备开始执行,等待CPU时间片。这并不意味着线程一定正在运行,它也可能因为其他线程占用CPU而暂时没有执行。

  3. BLOCKED(阻塞) - 一个线程尝试获取synchronized锁时如果锁已经被另一个线程持有,则当前线程会进入BLOCKED状态,直到它能够获得锁为止。此外,在等待I/O操作完成时也会进入此状态。

  4. WAITING(无限期等待) - 如果线程调用了Object类的wait()方法、没有设定超时的Thread.join()LockSupport.park()方法等,那么该线程将进入WAITING状态。这种状态下,线程不会被分配处理器时间,并且只有当其他线程显式地唤醒它(通过notify()notifyAll())或中断它时才会退出此状态。

  5. TIMED_WAITING(计时等待) - 类似于WAITING状态,但是有一个指定的最大等待时间。比如通过带有超时参数的方法如Thread.sleep(long millis)Object.wait(long timeout)、带超时的Thread.join(long millis)LockSupport.parkNanos(long nanos)等让线程进入此状态。一旦超时时间到达,即使没有被唤醒,线程也会自动从这个状态转换出去。

  6. TERMINATED(终止) - 当run()方法正常返回或者由于未捕获异常导致线程停止运行时,线程进入TERMINATED状态。此时线程被认为已经"死亡",不能再重新启动。

  7. 观察:NEW、RUNNABLE、TERMINATED、状态的转换

java 复制代码
package demo01;

public class ThreadStateTransger {
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            for (int i = 0; i < 1000_0000; i++) {

            }
        }, "李四");

        System.out.println(t.getName() + ":" + t.getState());
        
        t.start();
        while (t.isAlive()) {
            System.out.println(t.getName() + ":" + t.getState());
        }

        System.out.println(t.getName() + ":" + t.getState());
    }
}
  1. 观察:WAITING、BLOCKED、TIMED_WAITING 状态的转换

复制代码
```java
package demo01;

public class Test {
    public static void main(String[] args) {
        final Object object = new Object();
        Thread t1 = new Thread(() -> {
            synchronized (object) {
                while (true) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }, "t1");

        t1.start();


        Thread t2 = new Thread(() -> {
            synchronized (object) {
                System.out.println("hello t2");
            }
        });
        t2.start();


    }
}
```

使用jconsole可以看到:
  1. t1的状态是TIMED_WAITING

  2. t2的状态是BLOCKED

  3. 结论:

  4. • BLOCKED 表⽰等待获取锁, WAITING 和 TIMED_WAITING 表⽰等待其他线程发来通知.

  5. • TIMED_WAITING 线程在等待唤醒,但设置了时限; WAITING 线程在⽆限等待唤醒

相关推荐
扯淡的闲人7 分钟前
多语言编码Agent解决方案(2)-后端服务实现
开发语言·python·深度学习
烦躁的大鼻嘎28 分钟前
【Linux】深入Linux多线程架构与高性能编程
linux·运维·服务器·开发语言·c++·ubuntu
野生的编程萌新31 分钟前
【C++深学日志】C++编程利器:缺省参数、函数重载、引用详解
c语言·开发语言·c++
緈諨の約錠31 分钟前
JVM基础篇以及JVM内存泄漏诊断与分析
java·jvm
Slaughter信仰33 分钟前
深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第十三章知识点问答(15题)
java·开发语言·jvm
Java进阶笔记36 分钟前
JVM默认栈大小
java·jvm·后端
shan&cen1 小时前
Day04 前缀和&差分 1109. 航班预订统计 、304. 二维区域和检索 - 矩阵不可变
java·数据结构·算法
在线教学养猪1 小时前
Spring Task
java·后端·spring
_hermit:1 小时前
【从零开始java学习|小结】记录学习和编程中的问题
java·学习
小柯J桑_1 小时前
C++之特殊类设计
java·开发语言·c++