线程生命周期

结尾有彩蛋

多线程常见面试问题

  1. 调用new方法创建线程时,线程就创建了吗?
  2. 调用start方法后,线程就被执行了吗?
  3. 线程是能从BLOCKED状态直接进入RUNNING状态吗?
  4. 线程可以从TERMINATED状态转换为其他状态吗?

线程生命周期状态转化图

根据线程的生命周期,可以分为5个状态,但是如果从编程角度分析:有另一个版本的线程状态分类

  1. NEW(创建状态)
  2. RUNNABLE(可执行状态)
  3. RUNNING(执行状态)
  4. BLOCKED(阻塞状态)
  5. TERMINATED(死亡状态)

NEW(创建)状态

当使用new关键字创建一个线程对象时,此时线程并不是可执行状态,因为这时候还没有调用start方法,这个时候的线程处于NEW状态。

此时线程是不存在的,对,这个时候应该说只是创建了一个线程对象,并没有创建线程(第一个问题答案)。

NEW状态的线程只可以通过start方法进入RUNNABLE状态,只能进入RUNNABLE状态,不能进入RUNNING状态(实际上RUNNING状态可以看成一种特殊的RUNNABLE状态)。

RUNNABLE(可执行)状态

通过调用start方法线程对象进入RUNNABLE状态,这个时候JVM才会正在的去创建线程,但是此时线程没有被立即执行,或者说不能被立即执行(第二个问题答案)。线程是否被执行取决于能否得到CPU的调度,
也是由于这个原因,线程无法从new状态直接进入RUNNING状态,即便得到调度的时间很短。

另外,RUNNABLE状态的线程是不能直接进入BLOCKED状态的。
排除意外终止的情况,RUNNABLE状态的线程只能进入RUNNING状态。原因很简单,即便我们调用了waitsleep或者其他的线程操作,这些操作也必须得到CPU调度才能生效,一旦线程得到CPU调度,线程的状态也就从RUNNABLE转换为了RUNNING

RUNNING(执行)状态

一旦CPU从任务的可执行队列里选中了线程,线程这时候就转换为了RUNNING状态,也是这时候才开始执行自己的逻辑代码(包括wait,sleep等方法)。

RUNNING状态的线程可以发生如下几种情况的转换:

  1. 主动进入BLOCKED状态,例如:通过调用sleep或者wait方法,线程被加入到waitSet中。
  2. 被动进入BLOCKED状态,例如:获取锁资源,或者遇到阻塞IO操作等
  3. 进入TERMINATED状态,例如:调用了stop方法(该方法已经不推荐使用)或者意外中断。
  4. 主动进入RUNNABLE状态,调用yield方法放弃CPU的执行权。
  5. 被动进入RUNNABLE状态,CPU调度器放弃了该线程的执行权。

这个队列就是ThreadGroup,它非常重要

说到这个waitSet,上面说如果按照编程角度来看,还有其他的一种为线程分类的方式,而在waitSet中的线程在那种分类方式中叫Timed Waiting(限期等待)

BLOCKED(阻塞)状态

上面已经阐述了线程如何进入BLOCKED状态,接下来就聊一下线程可以从BLOCKED状态切换到哪些状态:

  1. 进入TERMINATED状态,例如:调用了stop方法(该方法已经不推荐使用)或者意外中断(例如:JVM Crash导致所有线程结束)。
  2. 线程阻塞操作结束,进入RUNABLE状态。
  3. 线程休眠结束,进入RUNNABLE状态
  4. wait 中的线程被其他线程调用notifynotifyall唤醒,进入RUNNABLE状态
  5. 线程得到锁资源,进入RUNNABLE状态。
  6. 其他线程调用了interrupt方法,线程进入RUNNABLE状态

线程是不能从BLOCKED状态直接进入RUNNING状态的。(问题3)

TERMINATED(终止)状态

先回答一下上面第四个的问题,线程是不能从TERMINATED状态转换为其他状态的。TERMINATED是线程的最终状态,线程进入该状态意味着线程的整个生命周期结束。

彩蛋


超神学院语录

我心存彦,吾彦永恒

留下一个问题:

Thread中的start和run方法是什么关系?

图解: 线程状态转换(线程生命周期这一篇够用了)相关推荐

  1. 【Java进阶营】Java技术专题「难点-核心-遗漏」Java线程状态流转及生命周期的技术指南(知识点串烧)

    前提介绍 本章主要介绍相关线程声明周期的转换机制以及声明周期的流转关系以及相关AQS的实现和相关的基本原理,配合这相关官方文档的中英文互译的介绍. 线程状态流转及生命周期 当线程被创建并启动以后,它既 ...

  2. 【深入浅出Java并发编程指南】「难点 - 核心 - 遗漏」线程状态流转及生命周期的技术指南(知识点串烧)

    前提介绍 本章主要介绍相关线程声明周期的转换机制以及声明周期的流转关系以及相关AQS的实现和相关的基本原理,配合这相关官方文档的中英文互译的介绍. 线程状态流转及生命周期 当线程被创建并启动以后,它既 ...

  3. 【图解】透彻Java线程状态转换

    大家好,我是阿星,好久不见,欢迎来到Java并发编程系列番外篇线程状态转换,内容通俗易懂,请放心食用. 线程状态 先来个开场四连问 Java线程状态有几个? Java线程状态是如何转换? Java线程 ...

  4. java线程主要状态及转换_Java线程状态转换及控制

    线程的状态(系统层面) 一个线程被创建后就进入了线程的生命周期.在线程的生命周期中,共包括新建(New).就绪(Runnable).运行(Running).阻塞(Blocked)和死亡(Dead)这五 ...

  5. java线程切换 notify_浅谈 Java线程状态转换及控制

    作者:城北有个混子 出自:博客园 1.线程的状态(系统层面) 一个线程被创建后就进入了线程的生命周期.在线程的生命周期中,共包括新建(New).就绪(Runnable).运行(Running).阻塞( ...

  6. Java并发知识梳理(上):并发优缺点,线程状态转换,Java内存模型,Synchronized,Volatile,final,并发三特性,Lock与AQS,ReetrandLock

    努力的意义,就是,在以后的日子里,放眼望去全是自己喜欢的人和事! 整个系列文章为Java并发专题,一是自己的兴趣,二是,这部分在实际理解上很有难度,另外在面试过程中也是经常被问到.所以在学习过程中,记 ...

  7. Java多线程——线程的优先级和生命周期

    Java多线程--线程的优先级和生命周期 摘要:本文主要介绍了线程的优先级以及线程有哪些生命周期. 部分内容来自以下博客: https://www.cnblogs.com/sunddenly/p/41 ...

  8. 详解java中Thread类,线程和进程的基本区别,多线程的好处,线程的五个生命周期,主线程和IDEA创建的Monitor Ctrl-Break守护线程;优雅地终止线程。死锁的产生

    线程:CPU调度的最小单位:线程共享堆内存和方法区,但各自享有栈空间.进程:CPU分配资源的最小单位. 为什么需要多线程:①避免其中一个模块阻塞造成系统假死:②程序异步处理(交替执行),提高程序执行效 ...

  9. java 线程状态_JAVA线程漫谈:线程状态与状态转换解析

    线程使用方式 JDK线程的顶层抽象是Runnable接口,本质上,线程相关的类都是基于Runnable和Thread实现类实现. JDK API级别有不同的创建线程的方式,但本质是还是基于Runnab ...

  10. Java基础加强重温_08:线程不安全、线程同步、线程状态、线程状态切换、线程池(Executors类、newFixedThreadPool)、死锁、Lambda表达式、Stream

    摘要 Java基础加强重温_08: 线程安全(线程安全概念.线程不安全案例). 线程同步(同步代码块.同步方法.Lock锁,锁对象). 线程状态(new新建.Runnable可运行.Blocked锁阻 ...

最新文章

  1. https://www.exploit-db.com/下载POC比较完善的代码
  2. WEB测试—用户界面测试
  3. Latex常用数学符号
  4. ie下提示SCRIPT1028:缺少标识符、字符串或数字
  5. python爬虫之路自学教程_python 爬虫学习之路
  6. JavaScript实现combine Without Repetitions不重复地结合算法(附完整源码)
  7. oracle创建数据库的三种方法
  8. 你的专业 VS 你妈口中你的专业
  9. 图像处理作业 第8次
  10. java跳转_java servlet 几种页面跳转的方法
  11. JAVA使用FTPClient类读写FTP
  12. Java知多少(50)Java throws子句
  13. 读书节第二日丨数据大咖来荐读,互动荐书赢好礼!
  14. 【水果识别】基于matlab GUI柑橘质量检测及分级系统【含Matlab源码 738期】
  15. 【设计模式】实现线程安全单例模式的五种方式
  16. 名师出高徒,我相信努力的我,会是高徒中的一员。
  17. 厦门大学计算机考研2020分数线,厦门大学2020考研分数线已公布
  18. 笔记本自动打开计算机,笔记本电脑自动开机是什么原因
  19. 内核编程初学者给“楚狂人”的一封信
  20. 如何实现查找附近的人

热门文章

  1. 信道估计之MMSE算法
  2. 音视频转换器哪个好?嗨格式视频转换器来了
  3. Java-视频按秒截取帧
  4. OSChina 周四乱弹 —— 你从小继承了程序员基因
  5. m序列产生原理及其性质
  6. iAntares OSx86 10.6.5 v3.2 繁简英整合版 安装过程【安装过程问题说明】
  7. 有什么软件可以测试U盘性能,最新版本:U盘性能检查测试软件简介
  8. adb shell 操作
  9. PE装机工具-U深度制作
  10. 风力摆控制系统,stm32f1程序,通过pid控制算法实现了风力摆摆定长直线,变长直线,一定角度摆动,定点停滞