详细介绍Java线程的生命周期

    欢迎大家搜索“小猴子的技术笔记”关注我的公众号,有问题可以及时和我交流。

详细介绍Java线程的生命周期
    一个线程由创建到死亡会经历自己的生命周期,我们可能会经常在博客中看到线程的“Running”状态,但是通过阅读Thread类的源码你又找不到“Running”状态,那么Java线程中到底有没有Running状态?

    首先通过查看“Thread”给我们提供的源码可以看到,线程的生命周期会经过如下的状态(注意,同一时刻,一个线程只能处于其中的一种状态):
详细介绍Java线程的生命周期

public enum State {
    // 线程还没有被启动的时候的状态
    NEW,
    // 表示调用了“start()”方法,这里还可以细分为“ready”和“running”状态
    RUNNABLE,
    // 线程等待进入到synchronized方法或者等待进入synchronized块
    BLOCKED,
    // 表示线程进入等待状态,比如调用了“wait()”、“join()”等
    WAITING,
    // 带有超时时间的
    TIMED_WAITING,
    // 线程正常结束,或者强制停止,或者遇到异常终止之后的状态
    TERMINATED;
}

    NEW:通过阅读官方给提供的源码注释可以了解,“NEW”表示线程还没有被启动的时候的状态。那么什么是还没有被启动呢?我们假设有一个实现了Runnable接口线程类。


public class ThreadState implements Runnable {
    @Override
    public void run() {
    }
}

    下面构建了一个线程,但是还没有调用“start()”方法,没有调用“start”方法之前,这个线程就是处于“NEW”状态。


public class ThreadStateTest {
    public static void main(String[] args) {
        Thread thread = new Thread(new ThreadState());
    }
}

    RUNNABLE:表示线程调用了“start()”方法,其实这里的Runnable状态可以分为另外的两个状态,分别是就绪状态和运行中状态。

public class ThreadStateTest {
    public static void main(String[] args) {
        Thread thread = new Thread(new ThreadState());
        thread.start();
    }
}

    因为,线程的启动需要被CPU选中之后才能够运行,因此对于就绪状态:表示线程已经被调用,也就是调用了“start()”方法,但是还没有真正的运行,需要等待CPU的调度之后执行,进入到“Running”状态,也就是线程执行中。

    Blocked:线程等待进入到synchronized方法或者等待进入synchronized块。
详细介绍Java线程的生命周期
    WAITING:等待状态,表示线程进入等待状态,比如调用了“wait()”、“join()”等没有超时时间的方法。此刻的等待线程只能被其他线程唤醒,而且处于等待中的状态的线程必须先进入到“ready(就绪)”状态,然后才能进入到“Running”状态(因为这涉及到了线程唤醒等待线程,是随机的)比如上篇文章中介绍wait和notify的基础用法的时候展示的例子,调用了“this.wait()”就是使当前线程进入到等待状态。

public void addMoney(int money) throws InterruptedException {
    synchronized (this) {
        while (balance <= money) {
            balance += money;
            System.out.println("老妈:存进了账户:" + money + "元,账户总金额为:" + balance + "元");
            this.notify();
            this.wait();
        }
    }
}

    TIMED_WAITING:超时等待状态,和WAITING状态相比,它是可以在指定时间内自行返回的。比如调用了“sleep(long time)”、“wait(long)”、“join(long)”等含有超时时间的方法,他们是会在一段时间内自动返回的。

public final native void wait(long timeout) throws InterruptedException;

    那么这个线程就会从等待状态返回,继续执行。

    TERMINATED:线程死亡状态,如执行完“run()”方法之后,正常结束。强制终止,调用了“stop()”或者“destory()”等。异常终止:执行过程中发生异常。

    通过阅读源码可以看出,Java并没有明确给出“Running状态”,而是将操作系统中的"Running"(运行)和“Ready(就绪)”合并为“Runable(运行状态)”

    这里给大家送上一副非常经典线程生命周期图,您品!您仔细地品!最后强烈推荐《Java并发编程的艺术》这本书!!!
详细介绍Java线程的生命周期
详细介绍Java线程的生命周期

上一篇:Kubernetes 安装Rook 1.3.11 ceph 14.2.10


下一篇:5.行为树(Behavior Tree)BT的装饰器节点