图解: 线程状态转换(线程生命周期这一篇够用了)
线程生命周期
结尾有
彩蛋
哦
多线程常见面试问题
- 调用
new
方法创建线程时,线程就创建了吗? - 调用
start
方法后,线程就被执行了吗? - 线程是能从
BLOCKED
状态直接进入RUNNING
状态吗? - 线程可以从
TERMINATED
状态转换为其他状态吗?
线程生命周期状态转化图
根据线程的生命周期,可以分为5个状态,但是如果从编程角度分析:有另一个版本的线程状态分类
- NEW(创建状态)
- RUNNABLE(可执行状态)
- RUNNING(执行状态)
- BLOCKED(阻塞状态)
- TERMINATED(死亡状态)
NEW(创建)状态
当使用new
关键字创建一个线程对象时,此时线程并不是可执行状态,因为这时候还没有调用start
方法,这个时候的线程处于NEW
状态。
此时线程是不存在的
,对,这个时候应该说只是创建了一个线程对象,并没有创建线程(第一个问题答案)。
NEW
状态的线程只可以通过start
方法进入RUNNABLE
状态,只能进入RUNNABLE
状态,不能进入RUNNING
状态(实际上RUNNING
状态可以看成一种特殊的RUNNABLE
状态)。
RUNNABLE(可执行)状态
通过调用start方法线程对象进入RUNNABLE
状态,这个时候JVM
才会正在的去创建线程,但是此时线程没有被立即执行,或者说不能被立即执行(第二个问题答案)。线程是否被执行取决于能否得到CPU的调度,
也是由于这个原因,线程无法从new状态直接进入RUNNING
状态,即便得到调度的时间很短。
另外,RUNNABLE
状态的线程是不能直接进入BLOCKED
状态的。
排除意外终止
的情况,RUNNABLE
状态的线程只能进入RUNNING
状态。原因很简单,即便我们调用了wait
,sleep
或者其他的线程操作,这些操作也必须得到CPU调度才能生效,一旦线程得到CPU调度,线程的状态也就从RUNNABLE
转换为了RUNNING
。
RUNNING(执行)状态
一旦CPU从任务的可执行队列里选中了线程,线程这时候就转换为了RUNNING状态,也是这时候才开始执行自己的逻辑代码(包括wait,sleep等方法)。
RUNNING状态的线程可以发生如下几种情况的转换:
- 主动进入
BLOCKED
状态,例如:通过调用sleep
或者wait
方法,线程被加入到waitSet
中。 - 被动进入
BLOCKED
状态,例如:获取锁资源,或者遇到阻塞IO操作等 - 进入
TERMINATED
状态,例如:调用了stop
方法(该方法已经不推荐使用)或者意外中断。 - 主动进入
RUNNABLE
状态,调用yield方法放弃CPU的执行权。 - 被动进入
RUNNABLE
状态,CPU调度器放弃了该线程的执行权。
这个队列就是
ThreadGroup
,它非常重要
说到这个
waitSet
,上面说如果按照编程角度来看,还有其他的一种为线程分类的方式,而在waitSet
中的线程在那种分类方式中叫Timed Waiting(限期等待)
BLOCKED(阻塞)状态
上面已经阐述了线程如何进入BLOCKED状态,接下来就聊一下线程可以从BLOCKED状态切换到哪些状态:
- 进入
TERMINATED
状态,例如:调用了stop
方法(该方法已经不推荐使用)或者意外中断(例如:JVM Crash导致所有线程结束)。 - 线程阻塞操作结束,进入
RUNABLE
状态。 - 线程休眠结束,进入
RUNNABLE
状态 - wait 中的线程被其他线程调用
notify
或notifyall
唤醒,进入RUNNABLE
状态 - 线程得到锁资源,进入
RUNNABLE
状态。 - 其他线程调用了
interrup
t方法,线程进入RUNNABLE
状态
线程是不能从
BLOCKED
状态直接进入RUNNING
状态的。(问题3)
TERMINATED(终止)状态
先回答一下上面第四个的问题,线程是不能从TERMINATED
状态转换为其他状态的。TERMINATED
是线程的最终状态,线程进入该状态意味着线程的整个生命周期结束。
彩蛋
超神学院语录
我心存彦,吾彦永恒
留下一个问题:
Thread中的start和run方法是什么关系?
图解: 线程状态转换(线程生命周期这一篇够用了)相关推荐
- 【Java进阶营】Java技术专题「难点-核心-遗漏」Java线程状态流转及生命周期的技术指南(知识点串烧)
前提介绍 本章主要介绍相关线程声明周期的转换机制以及声明周期的流转关系以及相关AQS的实现和相关的基本原理,配合这相关官方文档的中英文互译的介绍. 线程状态流转及生命周期 当线程被创建并启动以后,它既 ...
- 【深入浅出Java并发编程指南】「难点 - 核心 - 遗漏」线程状态流转及生命周期的技术指南(知识点串烧)
前提介绍 本章主要介绍相关线程声明周期的转换机制以及声明周期的流转关系以及相关AQS的实现和相关的基本原理,配合这相关官方文档的中英文互译的介绍. 线程状态流转及生命周期 当线程被创建并启动以后,它既 ...
- 【图解】透彻Java线程状态转换
大家好,我是阿星,好久不见,欢迎来到Java并发编程系列番外篇线程状态转换,内容通俗易懂,请放心食用. 线程状态 先来个开场四连问 Java线程状态有几个? Java线程状态是如何转换? Java线程 ...
- java线程主要状态及转换_Java线程状态转换及控制
线程的状态(系统层面) 一个线程被创建后就进入了线程的生命周期.在线程的生命周期中,共包括新建(New).就绪(Runnable).运行(Running).阻塞(Blocked)和死亡(Dead)这五 ...
- java线程切换 notify_浅谈 Java线程状态转换及控制
作者:城北有个混子 出自:博客园 1.线程的状态(系统层面) 一个线程被创建后就进入了线程的生命周期.在线程的生命周期中,共包括新建(New).就绪(Runnable).运行(Running).阻塞( ...
- Java并发知识梳理(上):并发优缺点,线程状态转换,Java内存模型,Synchronized,Volatile,final,并发三特性,Lock与AQS,ReetrandLock
努力的意义,就是,在以后的日子里,放眼望去全是自己喜欢的人和事! 整个系列文章为Java并发专题,一是自己的兴趣,二是,这部分在实际理解上很有难度,另外在面试过程中也是经常被问到.所以在学习过程中,记 ...
- Java多线程——线程的优先级和生命周期
Java多线程--线程的优先级和生命周期 摘要:本文主要介绍了线程的优先级以及线程有哪些生命周期. 部分内容来自以下博客: https://www.cnblogs.com/sunddenly/p/41 ...
- 详解java中Thread类,线程和进程的基本区别,多线程的好处,线程的五个生命周期,主线程和IDEA创建的Monitor Ctrl-Break守护线程;优雅地终止线程。死锁的产生
线程:CPU调度的最小单位:线程共享堆内存和方法区,但各自享有栈空间.进程:CPU分配资源的最小单位. 为什么需要多线程:①避免其中一个模块阻塞造成系统假死:②程序异步处理(交替执行),提高程序执行效 ...
- java 线程状态_JAVA线程漫谈:线程状态与状态转换解析
线程使用方式 JDK线程的顶层抽象是Runnable接口,本质上,线程相关的类都是基于Runnable和Thread实现类实现. JDK API级别有不同的创建线程的方式,但本质是还是基于Runnab ...
- Java基础加强重温_08:线程不安全、线程同步、线程状态、线程状态切换、线程池(Executors类、newFixedThreadPool)、死锁、Lambda表达式、Stream
摘要 Java基础加强重温_08: 线程安全(线程安全概念.线程不安全案例). 线程同步(同步代码块.同步方法.Lock锁,锁对象). 线程状态(new新建.Runnable可运行.Blocked锁阻 ...
最新文章
- https://www.exploit-db.com/下载POC比较完善的代码
- WEB测试—用户界面测试
- Latex常用数学符号
- ie下提示SCRIPT1028:缺少标识符、字符串或数字
- python爬虫之路自学教程_python 爬虫学习之路
- JavaScript实现combine Without Repetitions不重复地结合算法(附完整源码)
- oracle创建数据库的三种方法
- 你的专业 VS 你妈口中你的专业
- 图像处理作业 第8次
- java跳转_java servlet 几种页面跳转的方法
- JAVA使用FTPClient类读写FTP
- Java知多少(50)Java throws子句
- 读书节第二日丨数据大咖来荐读,互动荐书赢好礼!
- 【水果识别】基于matlab GUI柑橘质量检测及分级系统【含Matlab源码 738期】
- 【设计模式】实现线程安全单例模式的五种方式
- 名师出高徒,我相信努力的我,会是高徒中的一员。
- 厦门大学计算机考研2020分数线,厦门大学2020考研分数线已公布
- 笔记本自动打开计算机,笔记本电脑自动开机是什么原因
- 内核编程初学者给“楚狂人”的一封信
- 如何实现查找附近的人