线程都有哪几种状态?

点一点,有惊喜,欢迎各位大佬指点

本篇将详细讲述线程的所有状态,如果有想了解其他内容,请点击上面哦!!!


一、线程的状态

线程的状态是一个枚举类型Thread.State,一共有六种类型,分别是:

  1. NEW: 安排了工作, 还未开始行动
  2. RUNNABLE: 可工作的. 又可以分成正在工作中和即将开始工作.
  3. BLOCKED: 这几个都表示排队等着其他事情,表示等待获取锁
  4. WAITING: 这几个都表示排队等着其他事情,线程在无限等待唤醒
  5. TIMED_WAITING: 这几个都表示排队等着其他事情,线程在等待唤醒,但设置了时限
  6. TERMINATED: 工作完成了
public class ThreadDemo {
    public static void main(String[] args) {
        for (Thread.State state: Thread.State.values()) {
            System.out.println(state);
        }
    }
}

下面来详细讲述一下:

1.什么是NEW状态?

当线程对象创建后,就是进入了新建状态:

 2.什么是RUNNABLE状态?

当线程对象调用start()方法,线程就是进入了就绪状态。在就绪状态中,可分为正在工作和即将开始工作,并不是执行了start()此线程立即就会执行。

3.什么是Blocked状态?

阻塞状态是线程因为某种原因放弃CPU的使用权,暂停或停止运行,直到线程进入就绪状态,才有机会获得到CPU的注意,再次转入运行状态。

其中阻塞又分为三种情况:

1.等待阻塞:

运行的线程执行wait方法,则该线程会释放占用的所有资源,进入这个状态后是不能被自动唤醒的,需要调用notify/notifyAll 方法才能被唤醒。

2.同步阻塞:

运行的线程在获取对象的同步锁(synchronized)时,若该对象同步锁被其他线程占用了,则该线程会进入阻塞状态。

3.其他阻塞:

运行的线程执行sleep/join方法,或者发出了I/O请求时,线程会变为阻塞状态。当sleep方法等待超时、join方法等待线程终止或者超时、I/O处理完毕时,线程将重新转入就绪状态。

4.什么是RUNNING状态?

就绪状态的线程获取到了CPU使用权,执行程序代码,就绪状态是进入到运行状态的入口,要想运行,就要先进入就绪态。

5.什么是TERMINATED状态?

线程执行完毕或者因为其他原因退出运行,表示该线程生命周期结束。

二、线程的状态图

 三、线程状态转换

3.1 NEW、RUNNABLE、TERMINATED状态转换

class ThreadDemo3{
    public static void main(String[] args) {
        Thread t = new Thread(() -> {
            for (int i = 0; i < 10; 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());;
    }
}

3.2 WAITING 、 BLOCKED 、 TIMED_WAITING 状态的转换

class ThreadDemo4{
    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);
//                            object.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        },"t1");
        t1.start();
        System.out.println(t1.getState());

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (object) {
                    System.out.println("hehe");
                }
            }
        }, "t2");
        t2.start();
        System.out.println(t1.getState());
    }
}

 

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

3.3WAITING状态转换

class ThreadDemo4{
    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);
                            object.wait();
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        },"t1");
        t1.start();
        System.out.println(t1.getState());

        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (object) {
                    System.out.println("hehe");
                }
            }
        }, "t2");
        t2.start();
        System.out.println(t1.getState());
    }
}

 

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

结论:

  1. BLOCKED 表示等待获取锁, WAITING 和 TIMED_WAITING 表示等待其他线程发来通知.
  2. TIMED_WAITING 线程在等待唤醒,但设置了时限; WAITING 线程在无限等待唤醒
### 线程概念 线程,即轻量级进程(LWP: Light Weight Process),是程序执行流的最小单元。一个线程是一个进程内的顺序执行流。同一类别的多个线程共享一块内存空间和一组系统资源,而每个线程拥有自己的堆栈用于程序执行时的数据存储。由于线程间的切换开销较小,因此被称作轻负荷进程。在一个进程中可以存在多个线程来并发处理不同的任务[^2]。 ### Java线程的主要状态及其描述 #### 1. 新建 (NEW) 当线程对象被创建后,但尚未启动之前处于新建状态。此时该线程还没有开始运行任何操作,在调用`start()`方法前一直保持这种状态[^1]。 #### 2. 可运行 (RUNNABLE) 一旦调用了线程实例上的`start()`方法,线程就进入了可运行状态。这意味着JVM现在可以在适当的时候安排此线程去执行其体内的逻辑;然而,“可运行”并不意味着它当前正在CPU上实际执行——也可能是因为调度原因暂时未被执行。在这个状态下,线程可能正忙于计算或是等待I/O操作完成等事件的发生[^3]。 #### 3. 阻塞 (BLOCKED) 如果某个线程试图获取已被另一个活动中的线程占用的对象监视器锁(例如通过`synchronized`关键字保护的方法或代码块),那么这个请求失败并将使原尝试加锁的那个线程进入阻塞状态直到目标锁变得可用为止。一旦获得了所需的锁定条件满足,线程就会返回到之前的可运行状态继续前进。 #### 4. 等待 (WAITING) 当线程显式地调用了诸如`Object.wait()`, `Thread.join()` 或者`LockSupport.park()`这样的API之后会陷入无限期休眠并转入等待状态。除非接收到特定的通知信号唤醒它们,否则这些线程将一直处于停滞不前的状态中。比如对于`wait()`来说就是需要其他线程调用同一个对象上的`notify()/notifyAll()`方法来进行激活。 #### 5. 超时期等待 (TIMED_WAITING) 这是指那些设置了固定时限暂停下来的线程所处的一种特殊形式下的等待状况。典型的情况包括但不限于: - 使用带参数版本的`Thread.sleep(long millis)`函数指定毫秒数作为延迟间隔; - 带有超时选项的各种`wait(timeout)`,`join(timeout)` 和`parkNanos/timeUnit` API调用。 经过设定好的时间段过后即使没有任何外部干预也会自动苏醒过来转回至可运行队列里排队等候进一步指令[^4]。 #### 6. 终止 (TERMINATED) 无论正常结束还是因发生错误异常提前退出,只要完成了自身的使命或者无法再向前推进下去了,线程最终都将步入终止阶段不再参与后续的任务分配与执行过程之中。 ```java // 示例:展示如何创建并启动一个新的线程 public class Example { public static void main(String[] args){ Thread thread = new Thread(() -> System.out.println("这是一个新线程")); thread.start(); // 启动线程使其从 NEW 进入 RUNNABLE 状态 } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值