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

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

相关文章

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

SpringSecurity JWT基于令牌的无状态认证实现

《SpringSecurityJWT基于令牌的无状态认证实现》SpringSecurity中实现基于JWT的无状态认证是一种常见的做法,本文就来介绍一下SpringSecurityJWT基于令牌的无... 目录引言一、JWT基本原理与结构二、Spring Security JWT依赖配置三、JWT令牌生成与

Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码

《Java中Date、LocalDate、LocalDateTime、LocalTime、时间戳之间的相互转换代码》:本文主要介绍Java中日期时间转换的多种方法,包括将Date转换为LocalD... 目录一、Date转LocalDateTime二、Date转LocalDate三、LocalDateTim

golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法

《golang获取当前时间、时间戳和时间字符串及它们之间的相互转换方法》:本文主要介绍golang获取当前时间、时间戳和时间字符串及它们之间的相互转换,本文通过实例代码给大家介绍的非常详细,感兴趣... 目录1、获取当前时间2、获取当前时间戳3、获取当前时间的字符串格式4、它们之间的相互转化上篇文章给大家介

Python实现AVIF图片与其他图片格式间的批量转换

《Python实现AVIF图片与其他图片格式间的批量转换》这篇文章主要为大家详细介绍了如何使用Pillow库实现AVIF与其他格式的相互转换,即将AVIF转换为常见的格式,比如JPG或PNG,需要的小... 目录环境配置1.将单个 AVIF 图片转换为 JPG 和 PNG2.批量转换目录下所有 AVIF 图

详解如何通过Python批量转换图片为PDF

《详解如何通过Python批量转换图片为PDF》:本文主要介绍如何基于Python+Tkinter开发的图片批量转PDF工具,可以支持批量添加图片,拖拽等操作,感兴趣的小伙伴可以参考一下... 目录1. 概述2. 功能亮点2.1 主要功能2.2 界面设计3. 使用指南3.1 运行环境3.2 使用步骤4. 核

关于WebSocket协议状态码解析

《关于WebSocket协议状态码解析》:本文主要介绍关于WebSocket协议状态码的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录WebSocket协议状态码解析1. 引言2. WebSocket协议状态码概述3. WebSocket协议状态码详解3

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

Spring Boot3虚拟线程的使用步骤详解

《SpringBoot3虚拟线程的使用步骤详解》虚拟线程是Java19中引入的一个新特性,旨在通过简化线程管理来提升应用程序的并发性能,:本文主要介绍SpringBoot3虚拟线程的使用步骤,... 目录问题根源分析解决方案验证验证实验实验1:未启用keep-alive实验2:启用keep-alive扩展建