高频面试题-请说一下线程的生命周期!

简介: 这算是一个关于线程的基础问题了,但是依然很多面试官还是会问一下,倘若这个问题就卡住了,通过的几率就大打折扣了。当一个线程在创建、启动之后,并不是紧接着去执行代码块,这其中有一个过程,也就是一个线程开始到结束的一个生命周期了。全网其实有着两个版本的生命周期解释,大同小异。

五种状态

一种说法是五种状态,分别是新建(New)、就绪(Runnable)、运行(Running)、阻塞状态(Blocked)、线程死亡(Dead)。

六种状态

另一种说法是六种状态,分别是新建(New)、就绪/运行(Runnable)、结束(Terminated)、阻塞状态(Blocked)、等待(Waiting)、超时等待(Time_Waiting)。

注:这里的就绪/运行(Runnable),其实就包括了Running运行中状态和Ready就绪状态。

无论是五种还是六种,其实都很清楚的说明了一个线程从生到死的一个过程,而面试官问出的这个问题当然是不会这么简单了,这里还隐藏着一个更重要的点,那就是这些状态可以通过哪些方法进行相互切换,下面接着来看一下吧。

在这里我就不说五种状态的了,因为发现流程图笔记里面躺着一个六种状态的流程图,今天就着重说一下六种状态说法下的状态切换吧。

先上图!d055753f2bc8768e6b74c4d359179aa.png


图例解释

  1. 线程从New状态到Runnable状态,是通过Thread.start()方法进行切换的,这也是线程启动的第一步。
  2. 从Runnable状态到Blocked状态,需要线程执行代码块时产生锁,或者进行IO请求时,线程就会切换成阻塞状态;当锁被释放,或者IO请求完成时,线程就会从Blocked状态切换回Runnable状态了。
  3. 从Runnable状态到Waiting状态,需要线程代码块中调用wait()方法,使当前线程进行等待操作;当调用notify()方法,或者notifyAll()方法时,线程就会从Waiting状态切换回Runable状态了。
  4. 从Runnable状态到Time_Waiting状态,需要线程代码块中调用sleep()方法,因为sleep方法需要传一个时间的参数,所以这里一旦执行就会使当前线程进行一段时间的等待;只需要等待时间超时,线程就会从Time_Waiting状态切换回Runnable状态了。
  5. 从Runnable状态到Terminated状态,是最好理解的,就是代码执行完成后,就会切换到这个状态,也预示着这个线程的消亡,而线程一旦执行完成,也就会被线程池收回,或者直接销毁。

关于线程池的知识,之后可以细聊一下,今天就到这了,这次的知识虽然基础,但是一样重要,无论是面试还是日常工作都不可或缺,希望大家共同成长,打好基础。


目录
相关文章
|
5天前
|
Oracle Java 关系型数据库
一次惨痛的面试:“网易提前批,我被虚拟线程问倒了”
【5月更文挑战第13天】一次惨痛的面试:“网易提前批,我被虚拟线程问倒了”
28 4
|
7天前
|
消息中间件 前端开发 Java
美团面试:如何实现线程任务编排?
线程任务编排指的是对多个线程任务按照一定的逻辑顺序或条件进行组织和安排,以实现协同工作、顺序执行或并行执行的一种机制。 ## 1.线程任务编排 VS 线程通讯 有同学可能会想:那线程的任务编排是不是问的就是线程间通讯啊? 线程间通讯我知道了,它的实现方式总共有以下几种方式: 1. Object 类下的 wait()、notify() 和 notifyAll() 方法; 2. Condition 类下的 await()、signal() 和 signalAll() 方法; 3. LockSupport 类下的 park() 和 unpark() 方法。 但是,**线程通讯和线程的任务编排是
|
7天前
|
机器学习/深度学习 PyTorch 算法框架/工具
神经网络基本概念以及Pytorch实现,多线程编程面试题
神经网络基本概念以及Pytorch实现,多线程编程面试题
|
8天前
|
消息中间件 监控 前端开发
面试官:核心线程数为0时,线程池如何执行?
线程池是 Java 中用于提升程序执行效率的主要手段,也是并发编程中的核心实现技术,并且它也被广泛的应用在日常项目的开发之中。那问题来了,如果把线程池中的核心线程数设置为 0 时,线程池是如何执行的? 要回答这个问题,我们首先要了解在正常情况下,线程池的执行流程,也就是说当有一个任务来了之后,线程池是如何运行的? ## 1.线程池的执行流程 正常情况下(核心线程数不为 0 的情况下)线程池的执行流程如下: 1. **判断核心线程数**:先判断当前工作线程数是否大于核心线程数,如果结果为 false,则新建线程并执行任务。 2. **判断任务队列**:如果大于核心线程数,则判断任务队列是否
26 1
面试官:核心线程数为0时,线程池如何执行?
|
8天前
|
监控 安全 Java
【多线程学习】深入探究阻塞队列与生产者消费者模型和线程池常见面试题
【多线程学习】深入探究阻塞队列与生产者消费者模型和线程池常见面试题
|
8天前
|
存储 安全 Java
这些年背过的面试题——多线程篇
本文是技术人面试系列多线程篇,面试中关于多线程都需要了解哪些基础?一文带你详细了解,欢迎收藏!
|
8天前
|
安全 Java
面试官:线程调用2次start会怎样?我支支吾吾没答上来
面试官:线程调用2次start会怎样?我支支吾吾没答上来
14 1
|
8天前
|
Java 调度
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
48 1
|
6天前
|
Python
|
1天前
|
缓存 NoSQL Redis
【后端面经】【缓存】36|Redis 单线程:为什么 Redis 用单线程而 Memcached 用多线程?-- Redis多线程
【5月更文挑战第21天】Redis启用多线程后,主线程负责接收事件和命令执行,IO线程处理读写数据。请求处理流程中,主线程接收客户端请求,IO线程读取并解析命令,主线程执行后写回响应。业界普遍认为,除非必要,否则不建议启用多线程模式,因单线程性能已能满足多数需求。公司实际场景中,启用多线程使QPS提升约50%,或选择使用Redis Cluster以提升性能和可用性。
6 0

相关实验场景

更多