Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >面试系列之-线程的生命周期(JAVA基础)

面试系列之-线程的生命周期(JAVA基础)

作者头像
用户4283147
发布于 2023-08-21 12:19:47
发布于 2023-08-21 12:19:47
24800
代码可运行
举报
文章被收录于专栏:对线JAVA面试对线JAVA面试
运行总次数:0
代码可运行

线程生命状态说明

Thread.State是一个内部枚举类,定义了6个枚举常量,分别代表Java线程的6种状态:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static enum State {    NEW, //新建    RUNNABLE, //可执行:包含操作系统的就绪、运行两种状态    BLOCKED, //阻塞    WAITING, //等待    TIMED_WAITING, //限时等待    TERMINATED; //终止}

NEW状态:创建成功但是没有调用start()方法启动的Thread线程实例都处于NEW状态。

TIMED_WAITING状态:线程处于一种特殊的等待状态,准确地说,线程处于限时等待状态

(1)Thread.sleep(int n):使得当前线程进入限时等待状态,等待时间为n毫秒。

(2)Object.wait():带时限的抢占对象的monitor锁。

(3)Thread.join():带时限的线程合并。

(4)LockSupport.parkNanos():让线程等待,时间以纳秒为单位。

(5)LockSupport.parkUntil():让线程等待,时间可以灵活设置。

Thread.yield()方法作用是:暂停当前正在执行的线程对象(及放弃当前拥有的cup资源), 并执行其他线程。yield()做的是让当前运行线程回到可运行状态,以允许具有相同优先级的其 他线程获得运行机会。因此使用yield()的目的是让相同优先级的线程之间能适当的轮转执行。但是,实际中无法保证yield()达到让步目的,因为让步的线程还有可能被线程调度程序再次选中。

NEW:毫无疑问表示的是刚创建的线程,还没有开始启动。

RUNNABLE: 表示线程已经触发start()方式调用,线程正式启动,线程处于运行中状态。

BLOCKED:表示线程阻塞,等待获取锁,如碰到synchronized、lock等关键字等占用临界区的情况,一旦获取到锁就进行RUNNABLE状态继续运行。

WAITING:表示线程处于无限制等待状态,等待一个特殊的事件来重新唤醒,如通过wait()方法进行等待的线程等待一个notify()或者notifyAll()方法,通过join()方法进行等待的线程等待目标线程运行结束而唤醒,一旦通过相关事件唤醒线程,线程就进入了RUNNABLE状态继续运行。

TIMED_WAITING:表示线程进入了一个有时限的等待,如sleep(3000),等待3秒后线程重新进行RUNNABLE状态继续运行。

TERMINATED:表示线程执行完毕后,进行终止状态。

需要注意的是,一旦线程通过start方法启动后就再也不能回到初始NEW状态,线程终止后也不能再回到RUNNABLE状态。

线程状态切换详细说明

NEW状态

通过new Thread(…)已经创建线程,但尚未调用start()启动线程,该线程处于NEW(新建)状态。虽然前面介绍了4种方式创建线程,但是其中的其他三种方式本质上都是通过new Thread()创建线程,仅仅是创建了不同的target执行目标实例(如Runnable实例)。

RUNNABLE状态

Java把Ready(就绪)和Running(执行)两种状态合并为一种状态:RUNNABLE(可执行)状态(或者可运行状态)。调用了线程的start()实例方法后,线程就处于就绪状态。此线程获取到CPU时间片后,开始执行run()方法中的业务代码,线程处于执行状态。

就绪状态

就绪状态仅仅表示线程具备运行资格,如果没有被操作系统的调度程序挑选中,线程就永远处于就绪状态。当前线程进入就绪状态的条件大致包括以下几种:

·调用线程的start()方法,此线程就会进入就绪状态。

·当前线程的执行时间片用完。

·线程睡眠(Sleep)操作结束。

·对其他线程合入(Join)操作结束。

·等待用户输入结束。

·线程争抢到对象锁(Object Monitor)。

·当前线程调用了yield()方法出让CPU执行权限。

执行状态

线程调度程序从就绪状态的线程中选择一个线程,被选中的线程状态将变成执行状态。这也是线程进入执行状态的唯一方式。

BLOCKED状态

处于BLOCKED(阻塞)状态的线程并不会占用CPU资源,以下情况会让线程进入阻塞状态:

(1)线程等待获取锁

等待获取一个锁,而该锁被其他线程持有,则该线程进入阻塞状态。当其他线程释放了该锁,并且线程调度器允许该线程持有该锁时,该线程退出阻塞状态。

(2)IO阻塞

线程发起了一个阻塞式IO操作后,如果不具备IO操作的条件,线程就会进入阻塞状态。IO包括磁盘IO、网络IO等。IO阻塞的一个简单例子:线程等待用户输入内容后继续执行。

WAITING状态

处于WAITING(无限期等待)状态的线程不会被分配CPU时间片,需要被其他线程显式地唤醒,才会进入就绪状态。线程调用以下3种方法会让自己进入无限等待状态:

·Object.wait()方法,对应的唤醒方式为:

·Object.notify()/Object.notifyAll()。

·Thread.join()方法,对应的唤醒方式为:被合入的线程执行完毕。

·LockSupport.park()方法,对应的唤醒方式为:

·LockSupport.unpark(Thread)。

TIMED_WAITING状态

处于TIMED_WAITING(限时等待)状态的线程不会被分配CPU时间片,如果指定时间之内没有被唤醒,限时等待的线程会被系统自动唤醒,进入就绪状态。以下3种方法会让线程进入限时等待状态:

·Thread.sleep(time)方法,对应的唤醒方式为:sleep睡眠时间结束。

·Object.wait(time)方法,对应的唤醒方式为:调用

·Object.notify()/Object.notifyAll()主动唤醒,或者限时结束。

·LockSupport.parkNanos(time)/parkUntil(time)方法,对应的唤醒方式

为:线程调用配套的LockSupport.unpark(Thread)方法结束,或者线程停止(park)时限结束。

进入BLOCKED状态、WAITING状态、TIMED_WAITING状态的线程都会让出CPU的使用权;另外,等待或者阻塞状态的线程被唤醒后,进入Ready状态,需要重新获取时间片才能接着运行。

TERMINATED状态

线程结束任务之后,将会正常进入TERMINATED(死亡)状态;或者说在线程执行过程中发生了异常(而没有被处理),也会导致线程进入死亡状态。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-08-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 对线JAVA面试 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
线程生命周期,五大状态转换分析
本章学习完成,你将会对线程的生命周期有清楚的认识,并且明白不同状态之间是如何转换的,以及对java线程状态枚举类解读。
公众号 IT老哥
2020/09/16
5960
线程生命周期,五大状态转换分析
图解 Java 线程生命周期
创建线程(NEW),然后线程做自己的工作(RUNNABLE),做完之后就终止了(TERMINATED)。
dys
2020/08/20
3.4K0
图解 Java 线程生命周期
面试题92:Java线程有几种状态?
Java线程一共分为6种状态,分别为: 新建状态(NEW) 就绪状态(RUNNABLE) 阻塞状态(BLOCKED) 等待状态(WAITING) 限时等待状态(TIMED_WAITING) 结束状态(TERMINATED) 我们也可以通过Tread中的State枚举查看这六种状态的定义: public enum State { /** * Thread state for a thread which has not yet started. */
爪哇缪斯
2023/05/10
2640
面试题92:Java线程有几种状态?
很遗憾,没有一篇文章能讲清楚线程的生命周期!
大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。
彤哥
2019/10/23
3690
很遗憾,没有一篇文章能讲清楚线程的生命周期!
面试官:都说阻塞 I/O 模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?
使用 Java 阻塞 I/O 模型读取数据,将会导致线程阻塞,线程将会进入休眠,从而让出 CPU 的执行权,直到数据读取完成。这个期间如果使用 jstack 查看线程状态,却可以发现Java 线程状态是处于 RUNNABLE,这就和上面说的存在矛盾,为什么会这样?
andyxh
2019/10/08
1.6K0
面试官:都说阻塞 I/O 模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?
多线程基础(一): 线程概念及生命周期
什么是进程,相信大家都知道什么是进程却很难解释清楚。百科中的解释是:进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。 实际上,可以理解为,进程是操作系统中的某个程序关于某个数据集合的一次运行活动。是操作系统动态执行的基本单元。操作系统以进程为基本单元进行资源分配和任务执行。
冬天里的懒猫
2020/09/08
8380
并发多线程学习(五)Java线程的状态及主要转化方法
处于NEW状态的线程此时尚未启动。这里的尚未启动指的是还没调用Thread实例的start()方法。
用户10168815
2023/02/28
3180
并发多线程学习(五)Java线程的状态及主要转化方法
线程的六大状态的介绍
线程的生命周期包含5个阶段,包括:新建、就绪、运行、阻塞、销毁。 新建(New):创建后尚未启动的线程的状态 运行(Runnable):包含Running和Ready new的线程先进入new 状态,Start会进入ready状态,当操作系统分配时间片进入running状态 就绪→执行:处于就绪状态的进程,当进程调度程序为之分配了处理机后,该进程便由就绪状态转变成执行状态。 执行→就绪:处于执行状态的进程在其执行过程中,因分配给它的一个时间片已用完而不得不让出处理机,于是进程从执行状态转变成就绪状态。
名字是乱打的
2022/05/13
5770
线程的六大状态的介绍
面试必答题“聊聊Java中线程的生命周期状态”如何破?
👆点击“博文视点Broadview”,获取更多书讯 “聊聊Java中线程的生命周期状态吧!” 这几乎是一道面试必答题,这道题怎么答才是最佳答案呢?本文就带大家来破解一下! 01 一张图说明线程生命周期 JVM源码中将线程的生命周期分为新建(New)、可运行(Runnable)、阻塞(Blocked)、等待(Waiting)、超时等待(Timed_Waiting)和终止(Terminated)这6种状态。 在系统运行过程中不断有新的线程被创建,老的线程在执行完毕后被清理,线程在排队获取共享资源或者锁时将被
博文视点Broadview
2022/07/04
3380
面试必答题“聊聊Java中线程的生命周期状态”如何破?
Java线程Thread的状态解析以及状态转换分析 多线程中篇(七)
在Thread类中有内部类 枚举State,用于抽象描述Java线程的状态,共有6种不同的状态
noteless
2019/03/04
9210
Java线程Thread的状态解析以及状态转换分析 多线程中篇(七)
【高并发】线程的生命周期其实没有我们想象的那么简单!!
作者个人研发的在高并发场景下,提供的简单、稳定、可扩展的延迟消息队列框架,具有精准的定时任务和延迟队列处理功能。自开源半年多以来,已成功为十几家中小型企业提供了精准定时调度方案,经受住了生产环境的考验。为使更多童鞋受益,现给出开源框架地址:
冰河
2020/10/29
3630
【高并发】线程的生命周期其实没有我们想象的那么简单!!
java中线程的生命周期
线程是java中绕不过去的一个话题, 今天本文将会详细讲解java中线程的生命周期,希望可以给大家一些启发。
FunTester
2020/07/06
3650
java中线程的生命周期
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
在前面的几篇博客里,我们学习了Java的多线程,包括线程的作用、创建方式、重要性等,那么今天我们就要正式踏入线程,去学习更加深层次的知识点了。
JavaBuild
2024/05/27
1250
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
(二)Java线程与系统线程,生命周期
②Runnable 调用了start()方法,这时的线程就等待时间片轮转到自己这,以便获得CPU;第二种情况是线程在处于RUNNING状态时并没有运行完自己的run方法,时间片用完之后回到RUNNABLE状态;还有种情况就是处于BLOCKED状态的线程结束了当前的BLOCKED状态之后重新回到RUNNABLE状态。
HaC
2020/12/30
5080
(二)Java线程与系统线程,生命周期
Java线程状态详解
最近在深入研究Java并发编程,看到网上有很多关于线程状态的总结,有的不全面,有的根本就是错的。因此,在这里我结合最权威的Java源代码,尝试对Java线程状态进行一个详细的解读。
张申傲
2020/09/03
9560
Java线程状态详解
Java线程的几种状态
java.lang.Thread.State中定义的集中Java线程的状态: 1 /** 2 * A thread state. A thread can be in one of the following states: 3 * <ul> 4 * <li>{@link #NEW}<br> 5 * A thread that has not yet started is in this state. 6 * </li> 7 * <li>{@link
欠扁的小篮子
2018/04/10
1.5K0
Java线程的几种状态
Java线程生命周期与状态切换
最近有点懒散,没什么比较有深度的产出。刚好想重新研读一下JUC线程池的源码实现,在此之前先深入了解一下Java中的线程实现,包括线程的生命周期、状态切换以及线程的上下文切换等等。编写本文的时候,使用的JDK版本是11。
Throwable
2020/06/23
8980
Java中线程的状态变化
当线程被创建并启动以后,它既不是一启动就进入了执行状态,也不是一直处于执行状态。在线程的生命周期中,有几种状态呢?在API中java.lang.Thread.State这个枚举中给出了六种线程状态:
绿水长流z
2024/06/13
2080
Java中线程的状态变化
Java线程状态(生命周期)以及线程状态转换详解
线程状态转换进入等待/超时等待进入等待状态进入超时等待LockSupport类简介过期的suspend和resume方法
用户7886150
2021/04/20
7400
线程状态切换代码小记
《java并发编程》那本书其实反复的看过很多遍了,也扒了很多多线程相关文章,但是不用的话很快就又忘记了 ,想到一个概念于是动手操作了一遍,以便加深认知。
小小明童鞋
2020/05/11
8520
推荐阅读
相关推荐
线程生命周期,五大状态转换分析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档