Java线程基础 - 线程状态

news/2024/10/9 14:19:27

线程状态转换

新建(New)

创建后尚未启动,也就是初始状态

可运行(Runnable)

可能正在运行,也可能正在等待 CPU 时间片。
包含了操作系统线程状态中的 Running 和 Ready。

阻塞(Blocking)

阻塞状态是指线程因为等待某个条件(通常是I/O操作、获取锁、等待某些资源或者其他同步机制)而暂停执行的状态。

等待(Waiting)

处于这种状态的线程不会被分配CPU执行时间,它们要等待被显式地唤醒,否则会处于无限期等待的状态。

限期等待(Timed Waiting)

无需等待其它线程显式地唤醒,在一定时间之后会被系统自动唤醒。

终止(Terminated)

可以是线程结束任务之后自己结束,或者产生了异常而结束。

Q&A

  1. 如何理解线程的阻塞状态
    线程的阻塞状态是指线程因为等待某个条件(通常是I/O操作、获取锁、等待某些资源或者其他同步机制)而暂停执行的状态。在这种状态下,线程不会消耗CPU资源,因为它实际上没有在做任何工作,只是在等待。一旦阻塞的条件得到满足(例如I/O操作完成、锁被释放、资源变得可用),操作系统会将线程的状态改变为就绪状态,这样线程就可以再次被调度执行。
    以下是一些导致线程阻塞的常见情况:
    ● I/O阻塞:进行读写操作时,如果数据尚未准备好,线程将被阻塞,直到I/O操作可以继续进行。
    ● 同步阻塞:线程尝试获取一个已经被其他线程持有的锁时,它会被阻塞,直到锁被释放。
    ● 等待阻塞:线程在等待某个事件发生(如等待条件变量、信号量等)时,会被阻塞。

  2. 什么是线程上下文切换
    线程上下文切换是指操作系统在CPU上从一个线程切换到另一个线程的过程。这个过程涉及保存当前线程的上下文(包括程序计数器、寄存器集合、堆栈指针等状态信息)到线程的控制块中,并恢复下一个要执行的线程之前保存的上下文到CPU的寄存器中,这样下一个线程就可以接着之前的状态继续执行。
    线程上下文切换通常由以下几种情况触发:
    ● 时间片用尽:当线程使用完它的时间片(CPU分配给它的执行时间)后,操作系统会进行切换,给其他线程执行的机会。
    ● I/O请求:当线程发起一个I/O请求并因此被阻塞时,操作系统会切换到另一个线程,以充分利用CPU资源。
    ● 优先级:当更高优先级的线程变为就绪状态时,操作系统可能会中断当前线程,切换到更高优先级的线程执行。
    ● 同步机制:当线程在等待同步机制(如锁、信号量等)时,操作系统会进行切换,让其他线程有机会执行。
    线程上下文切换是有开销的,涉及到CPU寄存器和其他关键信息的存储与恢复,因此频繁的上下文切换可能会对系统性能产生负面影响。这就是为什么在设计高性能系统时,开发者会尽量减少不必要的上下文切换。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/27922.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

《代码随想录》-1.数组理论基础

特点: 1.内存空间-连续存放 ——> 增删元素麻烦 2.数据-相同类型 3.下标从0开始 注意:数组的元素采用覆盖的形式 二维数组在内存的空间地址: 1.C++中二维数组在地址空间上是连续的2.Java中二维数组每一行的头节点的地址是没有规则的

手写Spring框架

1. 手写Spring框架 @目录1. 手写Spring框架每博一文案2. 反射机制的回顾3. 开始手写 Spring 框架3.1 第一步:使用 IDE 创建模块myspring3.2 第二步:准备好我们要管理的Bean3.3 第三步:准备myspring.xml配置文件3.4 第四步:编写ApplicationContext接口3.5 第五步:编写Class…

腾讯公益赛团队博客10(2024.5.6)

未完成 在线医生、聊天室功能进行中 在多人手机端测试程序的可行性已完成 sos、帮扶基本功能、登录注册、主页

腾讯公益赛团队冲刺博客9(2024.5.3)

未完成 在线医生、聊天室、多人弹窗进行中 在线数据库的连接,保证不同的网络都可以连接到一个数据库已完成 sos、帮扶的基本功能,登录注册和主页

第三十八天:Ansible playbook--Role角色

角色是ansible自1.2版本引入的新特性,用于层次性、结构化地组织playbook。roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即 可。简单来讲,roles就是通过分别将变量、文件、任务、模板及处理器放置于单独的目…

腾讯公益赛冲刺团队博客1(2024.4.23)

未完成 项目还没开始进行中 登录注册已完成 无

腾讯公益赛冲刺团队博客4(2024.4.26)

未完成 sos功能后端,在线医生、社交功能进行中 帮扶功能的后端已完成 sos、帮扶前端、登录注册、主页

腾讯公益赛冲刺团队博客3(2024.4.25)

未完成 sos和帮扶功能的后端界面,以及其他两个功能进行中 sos和帮扶功能的前端已完成 登录注册和主页