面试题:线程有哪几种状态以及各种状态之间的转换?

2024-06-12 23:04

本文主要是介绍面试题:线程有哪几种状态以及各种状态之间的转换?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

线程在其生命周期中可以经历多种状态,不同资料来源可能给出略微不同的状态划分,但大体上可以概括为以下几种主要状态及它们之间的转换:

  1. 新建状态(New)

    • 当使用 new 关键字创建一个线程对象后,线程就处于新建状态。此时,线程还未开始执行,仅在 JVM 中分配了内存,并初始化了成员变量。
  2. 可运行状态(Runnable)

    • 当调用线程的 start() 方法后,线程进入可运行状态。此状态又可以细分为两种:
      • 就绪状态:线程已经准备好运行,等待CPU调度执行。
      • 运行状态:线程获得CPU时间片并正在执行。需要注意的是,Java文档有时将就绪和运行统称为“Runnable”状态。
  3. 阻塞状态(Blocked)

    • 线程在运行过程中,由于某种原因(如等待I/O操作完成、试图获取某个锁而被阻塞、调用 wait() 方法等)暂停执行,进入阻塞状态。在此状态下,线程不会消耗CPU时间。
  4. 等待状态(Waiting)

    • 线程主动放弃CPU执行权,进入无限期等待状态,直到被其他线程通过特定操作(如 notify() 或 notifyAll())唤醒。这包括调用 Object.wait()Thread.join() 无参方法或 LockSupport.park() 等情况。
  5. 超时等待状态(Timed Waiting)

    • 类似于等待状态,但线程不是无限等待,而是设置了等待的超时时间。例如,调用 Thread.sleep(long millis)Object.wait(long timeout)Thread.join(long millis) 或 LockSupport.parkNanos(long nanos) 等方法后,线程会在指定时间后自动醒来。
  6. 死亡状态(Terminated/Dead)

    • 线程执行完毕(即 run() 方法结束),或者因抛出未捕获的异常而提前结束,线程进入死亡状态,不再参与调度。

状态转换图概述

  • 新建状态 -> 可运行状态:调用 start() 方法。
  • 可运行状态 -> 阻塞状态:等待资源(如锁)。
  • 可运行状态 -> 等待/超时等待状态:调用相应的等待方法。
  • 阻塞/等待/超时等待状态 -> 可运行状态:等待条件满足,如获得锁、被唤醒、等待时间到期等。
  • 可运行状态 -> 死亡状态run() 方法执行完毕或异常终止。

这篇关于面试题:线程有哪几种状态以及各种状态之间的转换?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1055587

相关文章

JDK21对虚拟线程的几种用法实践指南

《JDK21对虚拟线程的几种用法实践指南》虚拟线程是Java中的一种轻量级线程,由JVM管理,特别适合于I/O密集型任务,:本文主要介绍JDK21对虚拟线程的几种用法,文中通过代码介绍的非常详细,... 目录一、参考官方文档二、什么是虚拟线程三、几种用法1、Thread.ofVirtual().start(

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

Java 线程池+分布式实现代码

《Java线程池+分布式实现代码》在Java开发中,池通过预先创建并管理一定数量的资源,避免频繁创建和销毁资源带来的性能开销,从而提高系统效率,:本文主要介绍Java线程池+分布式实现代码,需要... 目录1. 线程池1.1 自定义线程池实现1.1.1 线程池核心1.1.2 代码示例1.2 总结流程2. J

Java发送SNMP至交换机获取交换机状态实现方式

《Java发送SNMP至交换机获取交换机状态实现方式》文章介绍使用SNMP4J库(2.7.0)通过RCF1213-MIB协议获取交换机单/多路状态,需开启SNMP支持,重点对比SNMPv1、v2c、v... 目录交换机协议SNMP库获取交换机单路状态获取交换机多路状态总结交换机协议这里使用的交换机协议为常

Java JUC并发集合详解之线程安全容器完全攻略

《JavaJUC并发集合详解之线程安全容器完全攻略》Java通过java.util.concurrent(JUC)包提供了一整套线程安全的并发容器,它们不仅是简单的同步包装,更是基于精妙并发算法构建... 目录一、为什么需要JUC并发集合?二、核心并发集合分类与详解三、选型指南:如何选择合适的并发容器?在多

Java轻松实现PDF转换为PDF/A的示例代码

《Java轻松实现PDF转换为PDF/A的示例代码》本文将深入探讨Java环境下,如何利用专业工具将PDF转换为PDF/A格式,为数字文档的永续保存提供可靠方案,文中的示例代码讲解详细,感兴趣的小伙伴... 目录为什么需要将PDF转换为PDF/A使用Spire.PDF for Java进行转换前的准备通过

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

Java中如何正确的停掉线程

《Java中如何正确的停掉线程》Java通过interrupt()通知线程停止而非强制,确保线程自主处理中断,避免数据损坏,线程池的shutdown()等待任务完成,shutdownNow()强制中断... 目录为什么不强制停止为什么 Java 不提供强制停止线程的能力呢?如何用interrupt停止线程s

Python中Json和其他类型相互转换的实现示例

《Python中Json和其他类型相互转换的实现示例》本文介绍了在Python中使用json模块实现json数据与dict、object之间的高效转换,包括loads(),load(),dumps()... 项目中经常会用到json格式转为object对象、dict字典格式等。在此做个记录,方便后续用到该方