首页 > 编程语言 >Java线程基础 - 线程状态

Java线程基础 - 线程状态

时间:2024-05-05 21:55:23浏览次数:14  
标签:状态 Java 阻塞 线程 切换 上下文 等待 CPU

线程状态转换

新建(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寄存器和其他关键信息的存储与恢复,因此频繁的上下文切换可能会对系统性能产生负面影响。这就是为什么在设计高性能系统时,开发者会尽量减少不必要的上下文切换。

标签:状态,Java,阻塞,线程,切换,上下文,等待,CPU
From: https://www.cnblogs.com/hkz329/p/18173924

相关文章

  • [java与https]第一篇、证书杂谈
    一、算法、密钥(对)、证书、证书库令狐冲是个马场老板,这天,他接到店里伙计电话,说有人已经签了租马合同,准备到马场提马,,他二话不说,突突突就去了,到了之后,发现不认识租客。令狐冲说,你把你租马合同给我看看,这就是证书。没成想这租客是个二道贩子,他呼啦一下掏出来一个装满租马合同的文件......
  • java面试-mybatis篇
    1.#{}和${}的区别是什么#{}是预编译处理,在mybatis处理#{}时,会将其转换为?,这种方式可以有效避免sql注入。${}是字符串替换,在mybatis处理${}时,会将其替换成变量的值。2.通常一个xml映射文件,都会有一个对应的dao接口。请问这个dao接口原理是什么,dao接口的方法参数不同时,支......
  • Jmeter内存溢出:java.lang.OutOfMemoryError: Java heap space解决思路
    一、问题原因用JMeter压测,有时候当模拟并发请求较大或者脚本运行时间较长时,JMeter会停止,报OOM(内存溢出)错误。原因是JMeter是一个纯Java开发的工具,内存由java虚拟机JVM管理,当内存回收不及时,堆内存不足时,就会报内存溢错误。概念补充:内存泄露:应用使用资源之后没有及时释放,导致应......
  • FFmpeg开发笔记(十九)FFmpeg开启两个线程分别解码音视频
    ​同步播放音视频的时候,《FFmpeg开发实战:从零基础到短视频上线》一书第10章的示例程序playsync.c采取一边遍历一边播放的方式,在源文件的音频流和视频流交错读取的情况下,该方式可以很好地实现同步播放功能。但个别格式的音频流和视频流是分开存储的,前面一大段放了所有的音频帧,后......
  • 通过劫持线程arena实现任意地址分配 n1ctf2018_null
    通过劫持线程arena,当堆开了一个线程之后,如果没有做好保护随之的危险也悄然而至❗BUU上的n1ctf2018_null很好的说明了这个问题题目链接:BUUCTF在线评测(buuoj.cn)看一下保护:除了pie保护剩下的保护全开了,64位ida载入看一下上来是一个输入密码,密码是i'mreadyforchallenge......
  • HUAWEI USG6000系列面板状态说明
    前面板USG6310,USG6320前面板如图2-22所示。图2-22 USG6310,USG6320前面板表2-32 接口说明名称描述USB2.0接口插接U盘,通过U盘升级设备的系统软件等。有关U盘升级的相关介绍,请参见随版本配套发布的《升级指导书》。插接4GLTE数据卡,具体支持的型号请......
  • Java(5)-双亲委派机制
    如何理解双亲委派机制双亲委派机制是Java中类加载器加载类的一种方法,可以想象一个大家庭中的孩子想要一本书来阅读:在这个家庭中,孩子会先向他的父亲(子类加载器)要这本书,如果没有这本书,他的父亲就会去向孩子的祖父(父类加载器)要这本书。这个过程会一直持续,直到到达家族中的最高辈分,......
  • java exception and finally return
    exceptioncategorythrowableallbelongstothrowableerrorStackOverFlowOutOfMemoryruntimeexceptionArrayIndexOutOfBoundsExceptionNullPointerExceptioncheckecexception(needtocatchorthrows)catch最好设置一个兜底的匹配原则匹配的原则是:如果抛出的异......
  • java: 无效的目标发行版: 17 , 解决方案
    问题描述解决方案......
  • JavaScript--元素偏移量(offset)
    一、offset是什么 1、offset翻译过来就是偏移量,我们使用offset系列相关属性可以动态得到元素的位置(偏移)、大小(元素内容+padding+border);2、获得元素距离带有定位父元素的位置;3、注意:返回的数据都不带单位; offset系列常用属性:element.offsetHeight返回任何一个元素的高......