首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么主线程在不处于最低级别等待时被挂起?

主线程在不处于最低级别等待时被挂起的原因是为了避免浪费系统资源和提高系统的效率。当主线程没有任务可执行时,如果继续占用CPU资源,会导致其他线程无法得到执行,造成资源的浪费。为了解决这个问题,操作系统会将主线程挂起,让出CPU资源给其他线程使用。

主线程被挂起的情况包括但不限于以下几种情况:

  1. 等待外部事件:当主线程需要等待某个外部事件的发生时,例如用户输入、网络数据到达等,为了避免主线程空转浪费资源,主线程会被挂起,直到事件发生后再被唤醒。
  2. 等待子线程完成:当主线程创建并启动了子线程,并需要等待子线程完成某个任务后再继续执行时,主线程会被挂起,直到子线程完成任务后再被唤醒。
  3. 等待资源就绪:当主线程需要等待某个资源就绪后再进行后续操作时,例如等待文件读写完成、数据库查询结果返回等,主线程会被挂起,直到资源就绪后再被唤醒。

挂起主线程的好处是可以充分利用系统资源,提高系统的并发性和响应性。当主线程被挂起时,系统可以将CPU资源分配给其他线程或进程,使得多个任务可以并行执行,提高系统的整体效率。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(CVM):提供弹性计算能力,满足各类业务需求。详情请参考:https://cloud.tencent.com/product/cvm
  • 腾讯云容器服务(TKE):提供高度可扩展的容器化应用管理平台,简化容器部署和管理。详情请参考:https://cloud.tencent.com/product/tke
  • 腾讯云数据库(TencentDB):提供多种数据库产品,包括关系型数据库、NoSQL数据库等,满足不同业务场景的需求。详情请参考:https://cloud.tencent.com/product/cdb
  • 腾讯云人工智能(AI):提供丰富的人工智能服务,包括图像识别、语音识别、自然语言处理等,帮助开发者构建智能化应用。详情请参考:https://cloud.tencent.com/product/ai
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

线程基本概念

一个是正常运行的线程完成了它的全部工作;另一个是线程强制性的终止,如通过执行stop方法来终止(推荐),三是线程抛出未捕获的Exception或者Error。   ...挂起和休眠是独立的操作系统的概念,而阻塞与非阻塞则是资源不能得到时的两种处理方式,不限于操作系统,当资源申请不到时,要么挂起线程等待、要么继续执行其他操作,资源满足后再通知该线程重新请求。...文档没有细说,从该方法能指定等待时间来看,更可能是休眠,没有指定等待时间的,则可能是挂起,不管如何,休眠/挂起之前,JVM都会从当前线程中把该对象锁释放掉),只有以下几种情况下会被唤醒:其他线程调用了该对象的...,硬件执行每条指令都会校验指令的特权,比如:Intel x86架构的CPU将特权分为0-3四个特权级,0级的权限最高,3权限最低。   ...JDK5之前的synchronized效率低下,是因为阻塞线程就会被挂起、然后等待重新调度,而线程操作属于内核态,这频繁的挂起、调度使得操作系统频繁处于内核态和用户态的转换,造成频繁的变量传递、上下文保存等

72730

思维导图整理Java并发基础

上面是线程等待的方法,而唤醒线程主要是下面两个方法: notify() : 一个线程调用共享对象的 notify() 方法后,会唤醒一个该共享变量上调用 wait 系列方法后挂起线程。...6、线程死锁 死锁是指两个或两个以上的线程执行过程中,因争夺资源而造成的互相等待的现象,无外力作用的情况下,这些线程会一直相互等待而无法继续运行下去。 ? 那么为什么会产生死锁呢?...环路等待条件:指在发生死锁,必然存在一个线程——资源的环形链,即线程集合 {T0,T1,T2,…… ,Tn} 中 T0 正在等待一 T1 占用的资源,Tl1正在等待 T2用的资源,…… Tn 等待...当一个变量声明为volatile线程写入变量不会把值缓存在寄存器或者其他地方,而是会把值刷新回内存,当其它线程读取该共享变量,会从内存重新获取最新值,而不是使用当前线程的工作内存中的值。...构造函数传数,则默认是非公平锁。 例如,假设线程A已经持有了锁,这时候线程B请求该锁其将被挂起

48720
  • 2023百度面试真题

    唤醒的线程不会立刻执行 run 方法,它们要再次等待 CPU 分配资源进入运行状态; Waiting(无限等待):一个线程等待另一个线程执行一个(唤醒)动作,该线程进入 Waiting 状态。...进入这个状态后不能自动唤醒,必须等待另一个线程调用 notify 方法或者 notifyAll 方法才能够唤醒 销毁(TERMINATED):如果线程正常执行完毕后或线程提前强制性的终止或出现异常导致结束...一个线程等待另一个线程执行一个(唤醒)动作,该线程进入 Waiting 状态。...非阻塞 非阻塞调用是指调用方发出 request 的线程没有等到结果不会被挂起,并且直到得到response 后才返回。 阻塞和非阻塞最大的区别就是看调用方线程是否会被挂起。...finalize 机制现在已经推荐使用,并且 JDK 9 开始标记为deprecated。

    19220

    【Linux】死锁 | 条件变量部分理解

    死锁 概念 指一组进程中的各个进程均占有不会释放的资源, 但因互相申请其他进程所占用不会释放的资源而处于的一种永久等待的状态 ---- 有两个小朋友,张三和李四,共同去了一家商店,想要向老板 购买一块价值...循环等待:若干执行流之间形成一种头尾相接的循环等待资源的关系 张三向李四要5毛钱 ,同时释放自己的5毛钱 李四向张三 要5毛钱,同时释放自己的5毛钱 两者形成环路, 当张三不给李四,张三进行等待...,线程自己把自己挂起线程 设置解锁 ,看是否能帮助新线程中的锁进行 解锁 操作 ---- 运行可执行程序后,打印出i alive again,新线程挂起状态活过来了 说明一个线程申请一把锁,...检测 的对应的临界资源条件不满足,就进入等待状态 第一个参数为 要在那个条件变量中等待 第二个参数为 互斥锁 ---- 为什么互斥锁作为参数?...当唤醒后,会继续向后运行 打印出活动 ---- 函数中唤醒 该条件变量下等待线程 ---- ---- 当主线程每唤醒一个线程,就会打印出对应的活动 5 1 2 3 4 ,条件变量下进行排队

    28731

    深入理解 Java 多线程核心知识

    阻塞与非阻塞 阻塞和非阻塞通常用来形容多线程间的相互影响。比如一个线程占用了临界区资源,那么其它所有需要这个资源的线程就必须在这个临界区中进行等待等待会导致线程挂起。这种情况就是阻塞。...此时,如果占用资源的线程一直不愿意释放资源,那么其它所有阻塞在这个临界区上的线程都不能工作。阻塞是指线程操作系统层面挂起。阻塞一般性能不好,需大约8万个时钟周期来做调度。...,如果一个线程空闲的时间达到 keepAliveTime,则会终止,直到线程池中的线程超过 corePoolSize。...简单总结下线程池之间的参数协作分为以下几步: 线程优先向 CorePool 中提交; Corepool 满了之后,线程提交到任务队列,等待线程池空闲; 在任务队列满了之后 corePool 还没有空闲...当声明为 volatile 的变量进行写操作,那么这个变量需要将数据写到内存中。

    54610

    嵌入式开发基础之任务管理(线程管理)

    新建态 当线程刚开始创建还没开始运行时就处于初始状态;初始状态下,线程参与调度。 运行态 当一个任务正在运行时,那么就说这个任务处于运行态,处于运行态的任务就是当前正在使用处理器的任务。...阻塞态(挂起态) 阻塞态也称挂起态,它可能因为资源不可用而挂起等待,或线程主动延时一段时间而挂起挂起状态下,线程参与调度。...终止态 线程运行结束处于关闭状态。关闭状态的线程参与线程的调度。 任务优先级 线程的优先级是表示线程调度的优先程度。...每个线程都具有优先级,线程越重要,赋予的优先级就应越高,线程调度的可能才会越大。对于 ARM Cortex-M 系列,普遍采用 32 个优先级。最低优先级默认分配给空闲线程使用,用户一般不使用。...系统中,当有比当前线程优先级更高的线程就绪,当前线程将立刻换出,高优先级线程抢占处理器运行。优先级数字越低表示任务的优先级越低,0 的优先级最低

    85510

    嵌入式开发基础之任务管理(线程管理)

    新建态 当线程刚开始创建还没开始运行时就处于初始状态;初始状态下,线程参与调度。 运行态 当一个任务正在运行时,那么就说这个任务处于运行态,处于运行态的任务就是当前正在使用处理器的任务。...阻塞态(挂起态) 阻塞态也称挂起态,它可能因为资源不可用而挂起等待,或线程主动延时一段时间而挂起挂起状态下,线程参与调度。...终止态 线程运行结束处于关闭状态。关闭状态的线程参与线程的调度。 任务优先级 线程的优先级是表示线程调度的优先程度。...每个线程都具有优先级,线程越重要,赋予的优先级就应越高,线程调度的可能才会越大。对于 ARM Cortex-M 系列,普遍采用 32 个优先级。最低优先级默认分配给空闲线程使用,用户一般不使用。...系统中,当有比当前线程优先级更高的线程就绪,当前线程将立刻换出,高优先级线程抢占处理器运行。优先级数字越低表示任务的优先级越低,0 的优先级最低

    41130

    【玩转 RT-Thread】线程管理原理

    如下表所示: 状态 描述 初始态 当线程刚开始创建还没开始运行时就处于初始状态;初始状态下,线程参与调度。...此状态RT-Thread 中的宏定义为RT_THREAD_RUNNING 挂起态 也称阻塞态。它可能因为资源不可用而挂起等待,或线程主动延时一段时间而挂起挂起状态下,线程参与调度。...此状态RT-Thread 中的宏定义为RT_THREAD_SUSPEND 关闭态 当线程运行结束处于关闭状态。关闭状态的线程参与线程的调度。...(1)空闲线程 空闲线程是系统创建的最低优先级的线程线程状态永远为就绪态。当系统中无其他就绪线程存在,调度器将调度到空闲线程,它通常是一个死循环,且永远不能挂起。...处于挂起状态的线程,如果其等待的资源超时(超过其设定的等待时间),那么该线程将不再等待这些资源,并返回到就绪状态;或者,当其他线程释放掉该线程等待的资源,该线程也会返回到就绪状态。

    50920

    带你通过字节跳动面试---操作系统复习

    特权级: 、、、 相当于内核态, 相当于用户态 不同的特权级别可以运行不同的指令 区别: 内核态和用户态是操作系统的两种运行级别。用户态拥有最低的特权级,内核态拥有较高的特权级。...处于用户态,进程能够访问到的内存空间和对象受到限制,其所占有的处理机是可以抢占的。 处于内核态,进程能够访问所有的内存空间和对象,且所占有的处理机是不可以抢占的。...当有多个进程请求资源,就会造成内存资源紧张,所以操作系统还存在一种挂起操作:将进程交换到外存去,使进程进入挂起状态。 活动就绪:进程在内存,处于就绪状态,还需要 。...进程执行过程中被阻塞,整个进程就会挂起,那么进程中有些不依赖于等待资源的工作也不会执行。比如浏览器想要打印某个页面,打印机被占用,那么浏览器也无法提供别的服务。...当共享数据达到某个值,唤醒正在等待这个数据的线程,若没有共享数据分配,向申请的线程挂起。 自旋锁。

    1.4K20

    面试总结-操作系统

    死锁产生的四个必要条件: 互斥条件:一个资源每次只能一个进程使用 不可剥夺条件:进程已获得的资源,末使用完之前,不能强行剥夺 请求与保持条件:一个进程因请求资源而阻塞,对已获得的资源保持不放 循环等待条件...挂起某些死锁进程,并抢占它的资源,将这些资源分配给其他的死锁进程。但应防止挂起的进程长时间得不到资源,而处于资源匮乏的状态。 2) 撤销进程法。强制撤销部分、甚至全部死锁进程并剥夺这些进程的资源。...让一(多)个进程回退到足以回避死锁的地步,进程回退自愿释放资源而不是剥夺。要求系统保持进程的历史信息,设置还原点。 进程有哪几种状态?...就绪状态:进程已获得除处理机以外的所需资源,等待分配处理机资源; 运行状态:占用处理机资源运行,处于此状态的进程数小于等于CPU数; 阻塞状态: 进程等待某种条件,条件满足之前无法执行; 操作系统中进程调度策略有哪几种...进程的基本状态 状态:运行、阻塞、挂起阻塞、就绪、挂起就绪 状态之间的转换: 准备就绪的进程,CPU调度执行,变成运行态; 运行中的进程,进行I/O请求或者不能得到所请求的资源,变成阻塞态; 运行中的进程

    90630

    synchronized连环问-java并发编程基础知识储备

    执行count--有条紊,不会出现不安全的问题。 因此,代码层面,加关键字synchronized能解决上述线程安全问题。...monitorenter: Java对象天生就是一个Monitor,当monitor被占用,它就处于锁定的状态。 每个对象都与一个监视器关联。且只有在有线程持有的情况下,监视器才锁定。...升级重量级锁:向操作系统申请资源,linux mutex , CPU从3级-0级系统调用,线程挂起,进入等待队列,等待操作系统的调度,然后再映射回用户空间。 总结一下,锁升级的过程大概是这样的: ?...重量级锁有等待队列,所有拿不到锁的进入等待队列,不需要消耗CPU资源 偏向锁是否一定比自旋锁效率高? 不一定,明确知道会有多线程竞争的情况下,偏向锁肯定会涉及锁撤销,这时候直接使用自旋锁。...开启:-XX:BiasedLockingStartupDelay=0 自旋锁 自旋等待的时间或者次数是有一个限度的,如果自旋超过了定义的时间仍然没有获取到锁,则该线程应该被挂起

    35220

    进程处于挂起状态表示_挂起进程转换图

    此外,当处于就绪/挂起状态的进程比处于就绪态的任何进程的优先级都要高,也可以进行这种转换。这种情况的产生是由于操作系统设计者规定,调入高优先级的进程比减少交换量更重要。...这里大多来自其他博的文章,有以下几个方面的区别: 是否释放CPU:阻塞(pend)就是任务释放CPU,其他任务可以运行,一般等待某种资源或信号量的时候出现。...而挂起是主动的,因为挂起后还要受到CPU的监督(等待着激活),所以挂起释放CPU,比如sleep函数,站着CPU不使用。...与调度器是否相关:任务调度是操作系统来实现的,任务调度,直接忽略挂起状态的任务,但是会顾及处于pend下的任务,当pend下的任务等待的资源就绪后,就可以转为ready了。...而wait()方法释放了锁,使得其他线程可以使用同步控制块或者方法。 sleep()指线程调用时,占着CPU工作,形象的说明为“占着CPU”睡觉。

    1.3K20

    写给Java程序员看的,CPU 上下文切换、用户态、内核态、进程与线程上下文切换(转)

    Intel x86架构使用了4个级别来标明不同的特权级权限。 R0实际就是内核态,拥有最高权限,可以直接访问所有资源(包括外围设备,例如硬盘,网卡等)。而一般应用程序处于R3状态–用户态。...新进程什么时候才会被调度到 CPU 上运行呢? 1.运行中的进程执行完终止了,CPU 会释放出来,新的基础进程就可以调度到CPU上运行了。 2. 运行中的进程时间片用完,进程挂起 3....运行中的进程资源不足,进程挂起 4. 运行中的进程执行Sleep方法主动挂起 5. 新进程优先级更高,运行中的进程挂起 6....当进程只有一个线程,可以认为进程就等于线程,当进程拥有多个线程,这些线程会共享进程的虚拟内存和全局变量等资源。这些资源在上下文切换是不需要修改的。...线程的上下文切换其实就可以分为两种情况: 两个线程属于不同进程,因为资源共享,切换过程和进程上线文切换一样 两个线程属于同一个进程,只需要切换线程的私有数据、寄存器等共享的数据 5、总结 CPU上线文切换

    2.2K40

    synchronized底层实现知多少?synchronized加锁还会升级?

    还记得当初我们刚接触Java或者刚写Java代码怎么处理多线程访问共享数据的吗?加锁synchronized。但是,why?为什么加了synchronized就能保证共享数据一致了呢?...monitorenter: Java对象天生就是一个Monitor,当monitor被占用,它就处于锁定的状态。 每个对象都与一个监视器关联。且只有在有线程持有的情况下,监视器才锁定。...升级重量级锁:向操作系统申请资源,linux mutex , CPU从3级-0级系统调用,线程挂起,进入等待队列,等待操作系统的调度,然后再映射回用户空间。...重量级锁有等待队列,所有拿不到锁的进入等待队列,不需要消耗CPU资源 偏向锁是否一定比自旋锁效率高? 不一定,明确知道会有多线程竞争的情况下,偏向锁肯定会涉及锁撤销,这时候直接使用自旋锁。...开启:-XX:BiasedLockingStartupDelay=0 自旋锁 自旋等待的时间或者次数是有一个限度的,如果自旋超过了定义的时间仍然没有获取到锁,则该线程应该被挂起

    39320

    分布式应用异常测试一二说

    业务逻辑异常测试体现在当上述的第二种异常发生,是否能根据业务的需要或者架构的设计做出合理的业务处理反应,这是建立第二种异常测试之上的,因此异常测试的关系也已经非常明确了,第一种测试根据业务的不同,范围和流程有不确定性...: 单机:从系统层面来说就是指单一进程,从异常测试角度来看,影响范围发生在线程或进程级别线程级别的异常可能导致线程的结束,且没有启动新的线程来代替,进程级别可能导致线程锁的释放,导致其他线程挂起等待...分布式:分布式是一个协同工作的应用环境,这种异常往往容易引起其他进程的挂起,或者数据库、缓存、中间件的问题,主要有网络调用所占用的资源、数据库访问等。...,从而导致请求的大量堆积,线程池的处理线程用完,导致大量新的用户请求拒绝; 长连接:在网络出现异常状况后,断开的连接是否能重新建立,请求方如拿到失效的连接,是否能处理异常; 数据库: 数据源切换:如果所切换的数据源连接处于不可用状态或宕机时...,是否会长时间等待或重试; 表锁、行锁:长时间更新操作,导致其他对此表的修改操作挂起; 慢SQL的预防:通过对SQL的提前分析,来预防慢SQL相关的问题,及时告知DBA进行优化; 缓存: key的失效

    97060

    Java 中为什么推荐 while 循环中使用 sleep()

    前言最近逛 CSDN 看到一篇文章,文章大意是说为什么循环中推荐使用 sleep 操作,原因在于线程挂起和唤醒会有很大的性能消耗,并推荐使用 Timer 及 ScheduledExecutorService...// 如 FLAG 变量状态未改变 那么线程可能一直循环,并不断进行线程挂起和唤醒原因是否正确主要原因和原文博所说有很大的关系但不完全正确:我们都知道 Java 线程实际对应着操作系统中的一个线程,...对线程挂起和唤醒是一个很耗性能的操作,因此我们需要避免对线程进行挂起和唤醒;但还一个重要的原因是忙等待,如上文所示 FLAG 变量的状态可能永远不会被改变,那么线程将会不断进行挂起和唤醒,进入忙等待状态...事件机制上文的场景,我更推荐事件机制进行解耦,当变量改变,发送变量修改事件进行处理,如常见的 Spring Event 或者其它事件推送框架。... Java AQS 等待获取锁和线程池任务为空等待新任务,会使用等待和唤醒操作轮询机制 和 等待和唤醒 一般会结合使用,避免线程频繁的挂起和唤醒。

    1.3K30

    线程锁的升级原理是什么?

    来切换线程状态非常消耗系统资源;线程挂起和唤醒间隔很短暂,这样很浪费资源,影响性能。...偏向锁的撤销,需要在某个时间点上没有字节码正在执行时,先暂停拥有偏向锁的线程,然后判断锁对象是否处于锁定状态。...如果线程处于活动状态,则将对象头设置成无锁状态,并撤销偏向锁; 如果线程处于活动状态,升级为轻量级锁的状态。...但是当自旋超过一定的次数,轻量级锁便会升级为重量级锁;当一个线程已持有锁,另一个线程自旋,而此时又有第三个线程来访,轻量级锁也会升级为重量级锁。...重量级锁:指当有一个线程获取锁之后,其余所有等待获取该锁的线程都会处于阻塞状态。

    28710

    深入理解 Java 多线程核心知识:跳槽面试必备

    阻塞与非阻塞 阻塞和非阻塞通常用来形容多线程间的相互影响。比如一个线程占用了临界区资源,那么其它所有需要这个资源的线程就必须在这个临界区中进行等待等待会导致线程挂起。这种情况就是阻塞。...此时,如果占用资源的线程一直不愿意释放资源,那么其它所有阻塞在这个临界区上的线程都不能工作。阻塞是指线程操作系统层面挂起。阻塞一般性能不好,需大约8万个时钟周期来做调度。...创建状态 当用 new 操作符创建一个新的线程对象,该线程处于创建状态。 处于创建状态的线程只是一个空的线程对象,系统不为它分配资源。...不可运行状态 当发生下列事件处于运行状态的线程会转入到不可运行状态: 调用了 sleep() 方法; 线程调用 wait() 方法等待特定条件的满足; 线程输入/输出阻塞; 返回可运行状态; 处于睡眠状态的线程指定的时间过去后...简单总结下线程池之间的参数协作分为以下几步: 线程优先向 CorePool 中提交; Corepool 满了之后,线程提交到任务队列,等待线程池空闲; 在任务队列满了之后 corePool 还没有空闲

    43130

    深入理解 Java 多线程核心知识:跳槽面试必备

    比如一个线程占用了临界区资源,那么其它所有需要这个资源的线程就必须在这个临界区中进行等待等待会导致线程挂起。这种情况就是阻塞。...此时,如果占用资源的线程一直不愿意释放资源,那么其它所有阻塞在这个临界区上的线程都不能工作。阻塞是指线程操作系统层面挂起。阻塞一般性能不好,需大约8万个时钟周期来做调度。...创建状态 当用 new 操作符创建一个新的线程对象,该线程处于创建状态。 处于创建状态的线程只是一个空的线程对象,系统不为它分配资源。...不可运行状态 当发生下列事件处于运行状态的线程会转入到不可运行状态: 调用了 sleep() 方法; 线程调用 wait() 方法等待特定条件的满足; 线程输入/输出阻塞; 返回可运行状态; 处于睡眠状态的线程指定的时间过去后...简单总结下线程池之间的参数协作分为以下几步: 线程优先向 CorePool 中提交; Corepool 满了之后,线程提交到任务队列,等待线程池空闲; 在任务队列满了之后 corePool 还没有空闲

    932180
    领券