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

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

五种状态

一种说法是五种状态,分别是新建(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状态,是最好理解的,就是代码执行完成后,就会切换到这个状态,也预示着这个线程的消亡,而线程一旦执行完成,也就会被线程池收回,或者直接销毁。

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


目录
相关文章
|
14天前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
1月前
|
Java API 调度
Java 线程的生命周期
在JDK 1.5之前,线程的生命周期包括五种状态:新建(New)、就绪(Runnable)、运行(Running)、阻塞(Blocked)和死亡(Dead)。JDK 1.5及之后增加了三种阻塞状态,共六种状态:新建、可运行、终止、锁阻塞、计时等待和无限等待。这些状态描述了线程在操作系统和JVM中的不同阶段。
Java 线程的生命周期
|
2月前
|
Java 调度
[Java]线程生命周期与线程通信
本文详细探讨了线程生命周期与线程通信。文章首先分析了线程的五个基本状态及其转换过程,结合JDK1.8版本的特点进行了深入讲解。接着,通过多个实例介绍了线程通信的几种实现方式,包括使用`volatile`关键字、`Object`类的`wait()`和`notify()`方法、`CountDownLatch`、`ReentrantLock`结合`Condition`以及`LockSupport`等工具。全文旨在帮助读者理解线程管理的核心概念和技术细节。
38 1
[Java]线程生命周期与线程通信
|
2月前
|
Java 调度
Java一个线程的生命周期详解
Java中,一个线程的生命周期分为五个阶段:NEW(新建),RUNNABLE(可运行),BLOCKED(阻塞),WAITING(等待),TERMINATED(终止)。线程创建后处于新建状态,调用start方法进入可运行状态,执行中可能因等待资源进入阻塞或等待状态,正常完成或异常终止后进入终止状态。各状态间可相互转换,构成线程的生命周期。
|
3月前
|
存储 缓存 安全
【Java面试题汇总】多线程、JUC、锁篇(2023版)
线程和进程的区别、CAS的ABA问题、AQS、哪些地方使用了CAS、怎么保证线程安全、线程同步方式、synchronized的用法及原理、Lock、volatile、线程的六个状态、ThreadLocal、线程通信方式、创建方式、两种创建线程池的方法、线程池设置合适的线程数、线程安全的集合?ConcurrentHashMap、JUC
【Java面试题汇总】多线程、JUC、锁篇(2023版)
|
3月前
|
消息中间件 前端开发 NoSQL
面试官:线程池遇到未处理的异常会崩溃吗?
面试官:线程池遇到未处理的异常会崩溃吗?
77 3
面试官:线程池遇到未处理的异常会崩溃吗?
|
3月前
|
消息中间件 存储 前端开发
面试官:说说停止线程池的执行流程?
面试官:说说停止线程池的执行流程?
52 2
面试官:说说停止线程池的执行流程?
|
3月前
|
消息中间件 前端开发 NoSQL
面试官:如何实现线程池任务编排?
面试官:如何实现线程池任务编排?
36 1
面试官:如何实现线程池任务编排?
|
4月前
|
存储 安全 Java
【多线程面试题十七】、如果不使用synchronized和Lock,如何保证线程安全?
这篇文章探讨了在不使用`synchronized`和`Lock`的情况下保证线程安全的方法,包括使用`volatile`关键字、原子变量、线程本地存储(`ThreadLocal`)以及设计不可变对象。
【多线程面试题十二】、阻塞线程的方式有哪些?
线程阻塞的方式包括调用sleep()方法、阻塞式IO操作、等待同步监视器的获取、等待通知(notify),以及慎用的suspend()方法。

相关实验场景

更多