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

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

相关文章

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

hdu1565(状态压缩)

本人第一道ac的状态压缩dp,这题的数据非常水,很容易过 题意:在n*n的矩阵中选数字使得不存在任意两个数字相邻,求最大值 解题思路: 一、因为在1<<20中有很多状态是无效的,所以第一步是选择有效状态,存到cnt[]数组中 二、dp[i][j]表示到第i行的状态cnt[j]所能得到的最大值,状态转移方程dp[i][j] = max(dp[i][j],dp[i-1][k]) ,其中k满足c

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;

荣耀嵌入式面试题及参考答案

在项目中是否有使用过实时操作系统? 在我参与的项目中,有使用过实时操作系统。实时操作系统(RTOS)在对时间要求严格的应用场景中具有重要作用。我曾参与的一个工业自动化控制项目就采用了实时操作系统。在这个项目中,需要对多个传感器的数据进行实时采集和处理,并根据采集到的数据及时控制执行机构的动作。实时操作系统能够提供确定性的响应时间,确保关键任务在规定的时间内完成。 使用实时操作系统的

hdu3006状态dp

给你n个集合。集合中均为数字且数字的范围在[1,m]内。m<=14。现在问用这些集合能组成多少个集合自己本身也算。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.Inp

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

一些其他面试题

阿里二面:那你来说说定时任务?单机、分布式、调度框架下的定时任务实现是怎么完成的?懵了。。_哔哩哔哩_bilibili 1.定时算法 累加,第二层每一个格子是第一层的总时间400 ms= 20 * 20ms 2.MQ消息丢失 阿里二面:高并发场景下引进消息队列有什么问题?如何保证消息只被消费一次?真是捏了一把汗。。_哔哩哔哩_bilibili 发送消息失败

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点