面试官: 说一下线程的生命周期过程
前言
目前正在出一个Java多线程专题长期系列教程,从入门到进阶含源码解读, 篇幅会较多, 喜欢的话,给个关注❤️ ~
线程状态的转换
如题,这也是我们面试中常被问到的。我们先看一下系统中线程状态是如何转换的。之前我们在讲进程和线程的概述时提到过,线程可以被视为轻量级的进程。所以在系统调度过程中,他们的状态转换是一致的。
首先最开始是创建阶段 NEW, 下一个阶段是就绪阶段 Ready, 紧接着就是调度转为执行阶段 Running, 执行的这个过程中,可能会被打断又变为Ready阶段,还有可能一些IO阻塞事件又变为等待阶段 Waiting, 这个阶段又转换为 Ready阶段,当退出时,会转化为结束阶段 Terminated。说的有点抽象,大家可以对照下图理解一下。

操作系统线程主要有以下三个状态:
-
就绪状态(ready):线程正在等待使用CPU,经调度程序调用之后可进入running状态。 -
执行状态(running):线程正在使用CPU。 -
等待状态(waiting): 线程经过等待事件的调用或者正在等待其他资源(如I/O)。
Java中的线程状态
我们可以通过Thread.State查看它的状态枚举,一共提供了6种状态
TIMED_WAITING
a
调用以下方法,会导致线程处于WAITING,这里就不给大家一一演示了,差别其实就是是否指定了超时时间,大家可以自己试一下,可以参考上边。
-
Object.wait没有超时 -
没有超时的Thread.join -
LockSupport.park
TERMINATED
终止状态。此时线程已执行完毕。这个很好理解,之前给大家演示过了
Java线程状态转换
通过上面的了解之后,我们总结一下线程状态的转换
-
首先是
NEW阶段 -
调用
start进入Runable阶段 -
如果期间调用
wait(),join(),park(),线程会进去WAITING阶段,被唤醒后进入Runable阶段,可以通过notify(),nofityAll(),unpark()方式唤醒 -
如果期间调用
sleep(time), wait(time), parkNanos(time), parkUntil(time),join(time),线程会进入TIME_WAITING,被唤醒后进入Runable阶段,可以通过notify(),nofityAll(),unpark()方式唤醒 -
如果线程处于
等待锁状态,此时线程会进去BLOCK阶段,成功拿到锁后进入Runable阶段 -
最终运行结束会进入
TERMIATED阶段,也就是结束阶段
结束语
关于notify的用法,我们下节给大家讲,此处先有个印象,因为这个地方涉及到线程之间的通信了。本篇内容到这里就结束了, 大家自己一定要多去理解,不要去背, 下期给大家讲讲线程之间如何进行通信~
往期内容推荐
-
-
-
-
-
-
我的博客(阅读体验较佳)
-
-
-
-
-
项目源码(源码已更新 欢迎star⭐️)
-
java-thread-all
-
地址: https://github.com/qiuChengleiy/java-thread-all.git
推荐 SpringBoot & SpringCloud (源码已更新 欢迎star⭐️)
-
springboot-all
-
地址: https://github.com/qiuChengleiy/springboot-all.git -
-
本篇文章来源于微信公众号: 程序员皮卡秋
微信扫描下方的二维码阅读本文

Comments NOTHING