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

为什么挂起函数不会阻塞主线程?

挂起函数不会阻塞主线程的原因是因为挂起函数的执行是异步的。在传统的同步编程中,当一个函数被调用时,主线程会一直等待函数执行完毕才能继续执行下面的代码。但是在异步编程中,挂起函数的执行是非阻塞的,它会在执行过程中暂时挂起,并将控制权交还给主线程,使得主线程可以继续执行其他任务。

挂起函数通常会使用一种特殊的机制,例如回调函数、Promise、async/await等,来实现异步执行。当遇到一个挂起函数时,主线程会将其放入一个任务队列中,并继续执行后续的代码。当主线程空闲时,会从任务队列中取出挂起函数并执行。这样可以避免主线程被阻塞,提高程序的响应性和并发性能。

挂起函数的非阻塞执行对于处理耗时的操作非常有用,例如网络请求、文件读写、数据库查询等。通过将这些操作放在挂起函数中执行,可以避免主线程被阻塞,同时可以利用空闲时间执行其他任务,提高程序的效率。

在云计算领域,挂起函数的非阻塞执行可以用于处理大规模的并发请求,提高系统的吞吐量和响应速度。例如,在处理Web应用程序的请求时,可以将耗时的数据库查询操作放在挂起函数中执行,使得主线程可以继续处理其他请求,提高系统的并发性能。

腾讯云提供了一系列与异步编程相关的产品和服务,例如云函数(Serverless)、消息队列、分布式任务调度等,可以帮助开发者更好地利用挂起函数的非阻塞执行特性,构建高性能、可扩展的云计算应用。

更多关于腾讯云相关产品和服务的介绍,请访问腾讯云官方网站:https://cloud.tencent.com/

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么线程不会因为Looper.loop()方法造成阻塞

Looper进入循环 throw new RuntimeException("Main thread loop unexpectedly exited"); } loop()函数代码就不贴了...Looper.prepareMainLooper(); Looper.loop(); 主线程阻塞 关于死循环 主线程进入一个死循环,是不是就会被阻塞?...你不给我消息,我就会阻塞,减少CPU消耗(涉及到epoll)。 那么主线程会响应什么消息呢?...所以: Looper的阻塞,前提是没有输入事件,此时MessageQueue是空的,Looper进入空闲,线程进入阻塞,释放CPU,等待输入事件的唤醒。...先上结论和上面的做个对比: UI耗时导致卡死,前提是要有输入事件,此时MessageQueue不是空的,Looper正常轮询,线程并没有阻塞,但是该事件执行时间过长(一般5秒),而且与此期间其他的事件(

2.8K10

【Kotlin 协程】协程的挂起和恢复 ② ( 协程挂起线程阻塞 对比 )

文章目录 一、协程挂起线程阻塞 对比 1、协程挂起 2、线程阻塞 3、挂起阻塞对 UI 的影响 4、挂起分析 一、协程挂起线程阻塞 对比 ---- 挂起是协程中的概念 , 只能在协程中使用...; 阻塞线程中的概念 , 可以在主线程和子线程中使用 ; 1、协程挂起 协程 挂起 操作 : 在协程中使用 delay 函数 , 挂起 20 秒时间 , 然后 20 秒后更新 UI ; delay...Log.i("MainActivity", "GlobalScope : 主线程更新 UI") } 2、线程阻塞线程 阻塞 操作 : 在主线程 中使用 Thread.sleep 函数 , 阻塞 20...主线程更新 UI") 3、挂起阻塞对 UI 的影响 协程 挂起 操作 不会出现 阻塞 UI 刷新的情况 , 挂起的 20 秒不影响 UI 刷新显示 ; 但是如果将主线程阻塞 , UI 不再刷新 , 会出现..., ANR 崩溃异常 ; 4、挂起分析 协程中有挂起操作 , 会将挂起点的状态保存 , 同时协程停止执行 , 等待挂起函数执行完毕后 , 协程继续执行 ; 相当于阻塞的是协程 , 不会阻塞线程 ;

1.7K20
  • Android 主线程中 Looper.loop() 为什么不会卡死主线程

    第一次被问到这个问题的时候,就再想,为什么会问这问题呢?...Message.obtain()获取Message时候可以减少对象的创建 msg.recycleUnchecked(); } } Looper.loop() 为什么不会卡死主线程...1, 这里涉及到Linux pipe/epoll机制 ,简单说就是在主线程的MessageQueue没有消息时,便阻塞在loop的queue.next()中的nativePollOnce()方法里。...throw new RuntimeException("Main thread loop unexpectedly exited"); } 所以 在 Looper.loop() 中阻塞的时候不会卡死主线程...下面是ANR在官方文档的介绍: ANR 如果 Android 应用的界面线程处于阻塞状态的时间过长,会触发“应用无响应”(ANR) 错误。如果应用位于前台,系统会向用户显示一个对话框。

    1.4K10

    Kotlin协程知识累计

    执行一个挂起函数,在执行完挂起函数任务后会切换回该协程调度器指定的线程中去(也可能是切回原来的线程中去),挂起函数和协程都可以通过调度器指定运行在不同的线程。...挂起函数必须要带suspend修饰,但不是说被suspend修饰的函数就是线程切换的点,而是这个挂起函数有直接或间接的调用kotlin协程内自带的挂起函数来实现挂起,从而才实现线程的切换;suspend...注意: 1.单协程内多 suspend 函数运行:suspend 函数挂起挂起的是当前suspend 函数所在的协程;一个协程内的多个suspend 挂起函数是顺序执行的,上面的suspend函数没执行完是不会执行其他的...4.runBlocking {}会等待所有子协程执行完毕 2、非阻塞挂起:就是用阻塞式的代码写法,实现了非阻塞式的功能(同步代码写法实现异步任务) runBlocking本身会阻塞当前线程去等待...所以更为准确的说法是为什么我们使用发送消息的方式来同步信息,而不是多个线程或者协程直接共享内存?

    22310

    面试官:都说阻塞 IO 模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE?

    使用 Java 阻塞 I/O 模型读取数据,将会导致线程阻塞线程将会进入休眠,从而让出 CPU 的执行权,直到数据读取完成。...这个期间如果使用 jstack 查看线程状态,却可以发现Java 线程状态是处于 RUNNABLE,这就和上面说的存在矛盾,为什么会这样?...上面的矛盾其实是混淆了操作系统线程状态与 Java 线程状态。这里说的线程阻塞进入休眠状态,其实是操作系统层面线程实际状态。而我们使用 jstack 查看的线程状态却是 JVM 中的线程状态。...休眠状态,运行状态下的线程如果调用阻塞 API,如阻塞方式读取文件, 线程状态就将变成休眠状态。这种情况下,线程将会让出 CPU 使用权。休眠结束,线程状态将会先变成可运行状态。...其他 Java 线程状态与操作线程状态类似。 面试官:都说阻塞 I/O 模型将会使线程休眠,为什么 Java 线程状态却是 RUNNABLE? ?

    1.5K10

    同步、异步、阻塞、非阻塞

    阻塞 阻塞调用是指调用结果返回之前,当前线程会被挂起函数只有在得到结果之后才会返回。有人也许会把阻塞调用和同步调用等同起来,实际上它们是不同的。...而此时,当前线程还会继续处理各种各样的消息。如果窗口和调用函数在同一个线程中,除非你在特殊的界面操作函数中调用,其实界面还是应该可以刷新。...socket接收数据的另外一个函数recv则是一个阻塞调用的例子。当socket工作在阻塞模式的时候, 如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据为止。...非阻塞阻塞阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。...(线程挂起).如果select 函数,的最后一个timeout 参数为NULL,程序就会停止在select这里。

    3K40

    Kotlin 协程总结

    a.什么时候需要自定义 suspend 函数 a.具体该怎么写 5.小结 三、挂起的非阻塞式是怎么回事 1.什么是「非阻塞挂起」 2.为什么要讲非阻塞挂起 3.协程与线程 4.小结 四、总结 一、协程是什么...如果你去看一些技术博客或官方文档的时候,大概可以了解到:「代码执行到 suspend 函数的时候会『挂起』,并且这个『挂起』是非阻塞式的,它不会阻塞你当前的线程。」...通过刚才的分析我们知道:挂起之后是需要恢复。 而恢复这个功能是协程的,如果你不在协程里面调用,恢复这个功能没法实现,所以也就回答了这个问题:为什么挂起函数必须在协程或者另一个挂起函数里被调用。...2.为什么要讲非阻塞挂起 协程只是在写法上「看起来阻塞」,其实是「非阻塞」的,因为在协程里面它做了很多工作,其中有一个就是帮我们切线程。...四、总结 协程就是切线程挂起就是可以自动切回来的切线程挂起的非阻塞式指的是它能用看起来阻塞的代码写出非阻塞的操作,就这么简单。 参考: 1,Kotlin 的协程用力瞥一眼 - 学不会协程?

    3.2K11

    Kotlin中的协程及在Android中的应用

    从开发者角度来看:kotlin协程可以实现以同步的方式去编写异步执行的代码,解决线程切换回调的嵌套地狱。 协程挂起时不需要阻塞线程,几乎是无代价的。...创建协程的方式 runBlocking 这是一个顶层函数,会启动一个新的协程并阻塞调用它的线程,直到里面的代码执行完毕,返回值是泛型T。...EmptyCoroutineContext, block: suspend CoroutineScope.() -> T): T CoroutineScope.launch 通过一个协程作用域的扩展方法launch启动一个协程,不会阻塞调用它的线程...block: suspend CoroutineScope.() -> Unit ): Job CoroutineScope.async 通过一个协程作用域的扩展方法async启动一个协程,不会阻塞调用它的线程...挂起是非阻塞性的挂起不会阻塞线程;恢复不用我们手动恢复,而是协程帮我们完成。

    17210

    思维导图整理Java并发基础

    notifyAll() :不同于在共享变量上调用 notify() 函数会唤醒被阻塞到该共享变量上的一个线程,notifyAll()方法则会唤醒所有在该共享变量上由于调用 wait 系列方法而被挂起线程...如果线程A因为调用了wait() 系列函数、 join 方法或者 sleep 方法阻塞挂起,这时候若线程 B调用线程A的interrupt()方法,线程A会在调用这些方法的地方抛出InterruptedException...synchronized 块内使用到该变量时就不会线程的工作内存中获取,而是直接从内存中获取。...当一个变量被声明为volatile时,线程在写入变量时不会把值缓存在寄存器或者其他地方,而是会把值刷新回内存,当其它线程读取该共享变量,会从内存重新获取最新值,而不是使用当前线程的工作内存中的值。...构造函数不传数,则默认是非公平锁。 例如,假设线程A已经持有了锁,这时候线程B请求该锁其将被挂起

    48720

    美团一面:为什么线程崩溃崩溃不会导致 JVM 崩溃

    大家好,我是坤哥 网上看到一个很有意思的美团面试题:为什么线程崩溃崩溃不会导致 JVM 崩溃,这个问题我看了不少回答,但发现都没答到根上,所以决定答一答,相信大家看完肯定会有收获,本文分以下几节来探讨...线程崩溃,进程一定会崩溃吗 进程是如何崩溃的-信号机制简介 为什么在 JVM 中线程崩溃不会导致 JVM 进程崩溃 openJDK 源码解析 线程崩溃,进程一定会崩溃吗 一般来说如果线程是因为非法访问内存引起的崩溃...,那么进程肯定会崩溃,为什么系统要让进程崩溃呢,这主要是因为在进程中,各个线程的地址空间是共享的,既然是共享,那么某个线程对地址的非法访问就会导致内存的不确定性,进而可能会影响到其他线程,这种操作是危险的...这种场景显然不能用 kill -9,不然一下把进程干掉了资源就来不及清除了 为什么线程崩溃不会导致 JVM 进程崩溃 现在我们再来看看开头这个问题,相信你多少会心中有数,想想看在 Java 中有哪些是常见的由于非法访问内存而产生的...,并抛出 StackoverflowError 和 NPE,这就是为什么 JVM 不会崩溃且我们能捕获这两个错误/异常的原因 如果针对 SIGSEGV 等信号,在以上的函数中 JVM 没有做额外的处理,

    2.1K20

    万字长文 | 漫谈libco协程设计及实现

    但递归如此之深的协程实际中不会遇到,更多的场景应该是协程调用协程1,协程1挂起切回协程,协程再调用协程2,协程2挂起切回协程,协程再调用协程3...因此协程调到协程k时,pCallStack...同步调用read使用同步阻塞IO,kernel等待数据到达,再将数据拷贝到用户线程,这两个阶段用户线程都被阻塞。...而协程调用read使用多路复用IO模型,用户线程调用read后,第一阶段也不会阻塞,但第二个阶段会被阻塞,epoll多路复用IO模型可以在一个线程管理多个socket。...2.2 非阻塞IO 协程的epoll多路复用IO模型使用的是非阻塞IO,发起read操作后,可立即挂起协程,并调度其他协程。...注意不可用sleep,因为sleep会睡眠线程线程睡眠了,协程无法被调度,所有的协程也都不会执行了。

    4.9K52

    万字长文 | 漫谈libco协程设计及实现

    但递归如此之深的协程实际中不会遇到,更多的场景应该是协程调用协程1,协程1挂起切回协程,协程再调用协程2,协程2挂起切回协程,协程再调用协程3...因此协程调到协程k时,pCallStack...同步调用read使用同步阻塞IO,kernel等待数据到达,再将数据拷贝到用户线程,这两个阶段用户线程都被阻塞。...而协程调用read使用多路复用IO模型,用户线程调用read后,第一阶段也不会阻塞,但第二个阶段会被阻塞,epoll多路复用IO模型可以在一个线程管理多个socket。...2.2 非阻塞IO 协程的epoll多路复用IO模型使用的是非阻塞IO,发起read操作后,可立即挂起协程,并调度其他协程。...注意不可用sleep,因为sleep会睡眠线程线程睡眠了,协程无法被调度,所有的协程也都不会执行了。

    1.3K10

    网络编程 同步,阻塞,异步,非阻塞之区别

    网络编程之同步,阻塞,异步,非阻塞 同步:函数没有执行完不返回,线程挂起 阻塞:没有收完数据函数不返回,线程也被挂起 异步:函数立即返回,通过事件或是信号通知调用者 非阻塞函数立即返回,通过select...至于回调函数,其实和通知没太多区别。 阻塞调用是指调用结果返回之前,当前线程会被挂起函数只有在得到结果之后才会返回。有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。...而此时,当前线程还会继续处理各种各样的消息。 如果窗口和调用函数在同一个线程中,除非你在特殊的界面操 作函数中调用,其实界面还是应该可以刷新。...socket接收数据的另外一个函数recv则是一个阻塞调用的例子。当socket工作在阻塞模式的时候, 如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据为止。...非阻塞阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。对象的阻塞模式和阻塞函数调用对象是否处于阻塞模式和函数是不是阻塞调用有很强的相关性,但是并不是一一对应的。

    35720

    深入理解并发并行,阻塞阻塞,同步异步

    版权声明:本文为博原创文章,未经博允许不得转载。...阻塞调用是指调用结果返回之前,调用者会进入阻塞状态等待。只有在得到结果之后才会返回。 非阻塞调用是指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。...阻塞调用:比如 socket 的 recv(),调用这个函数线程如果没有数据返回,它会一直阻塞着,也就是 recv() 后面的代码都不会执行了,程序就停在 recv() 这里等待,所以一般把 recv...非阻塞调用:比如非阻塞socket 的 send(),调用这个函数,它只是把待发送的数据复制到TCP输出缓冲区中,就立刻返回了,线程不会阻塞,数据有没有发出去 send() 是不知道的,不会等待它发出去才返回的...死锁的解除有个著名的银行家算法 阻塞挂起阻塞是被动的,比如抢不到资源。挂起是主动的,线程自己调用 suspend() 把自己退出运行态了,某些时候调用 resume() 又恢复运行。

    1.2K10

    Kotlin 协程之Practice

    不会造成线程阻塞,只能在协程中使用             delay(1000L)//无阻塞1秒然后输出             Log.i(tag,"world")//延迟后将打印输出...阻塞线程2秒,保证JVM存活 //        runBlocking {//阻塞线程2秒,保证JVM存活 //            delay(2000L) //        } //        ...future,使用await在一个延期的值上得到结果,它是一个接口继承自Job对象,也就是说它也是一个job对象,可以进行取消操作     //async 风格函数   该函数不是挂起函数,可以在任何地方执行...doSome2()     }       fun ttest(){         val time = measureTimeMillis {             //在协程外面异步执行,执行完成,在调用挂起函数进行阻塞...挂起后,它将完全由所运行的线程中恢复挂起函数,     //非受限调度器是合适的,它在协程没有消耗CPU时间或共享数据时被限制在指定线程中     fun testDispatcherMain() =

    1.2K20

    15个node.js经典面试题和答案,核心基础

    4、Node.js如何克服I/O操作阻塞的问题 ? 5、为什么Node.js是单线程的 ? 6、如果 Node.js 是单线程的,那么它如何处理并发 ?...最后,还有充足的库,这样我们就不需要重新发明轮子了 4、Node.js如何克服I/O操作阻塞的问题 ? 由于节点有一个事件循环,可用于以异步方式处理所有 I/O 操作,而不会阻塞 main 函数。...因此,即使我们有单线程 JS,I/O 操作也是以非阻塞方式处理的。 4、为什么Node.js是单线程的 ? Node.js 是作为异步处理的实验显式创建的。...循环是单线程的,所有异步调用都由 libuv 库管理。 carbon (1).png 6、Node.js 中有多少种 API 函数 ?...有两种类型的 API 函数: 异步、非阻塞函数:主要是 I/O 操作,可以从循环中分叉出来。 同步的、阻塞函数 :主要是影响在循环中运行的进程的操作。

    1.9K20

    kotlin--协程入门

    为什么说这是一种趋势,就像我们之前学习的函数式编程,从最开始的面向方法编程,到面向对象编程,再到函数式编程,程序员们经历了造轮子,用轮子,再最后到的“指挥”。...俗话说的好:不会偷懒的程序员不是一个好的程序员,能复制粘贴的绝对不会手写。...和resume suspend:也称为挂起或暂停,用于暂停执行当前协程,并保存所有局部变量 resume:用于让已暂停的协程从其暂停出继续执行 1.挂起函数 使用suspend关键字修饰的函数叫做挂起函数...挂起函数只能在协程体内或其他挂起函数内调用 挂起主要是和阻塞进行对比,挂起函数调用时并不会阻塞当前线程 挂起: class MainActivity : AppCompatActivity() {...text = "sleep" } } 效果: 阻塞.gif 很明显我们的主线程阻塞了,但挂起不会,并且挂起函数执行完后,自动执行下面的更新ui的代码,我们再也不用写回调函数

    61310

    同步、异步、阻塞、非阻塞

    至于回调函数,其实和通知没太多区别。 阻塞 阻塞调用是指调用结果返回之前,当前线程会被挂起函数只有在得到结果之后才会返回。有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。...对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。例如,我们在CSocket中调用Receive函数,如果缓冲区中没有数据,这个函数就会一直等待,直到有数据才返回。...而此时,当前线程还会继续处理各种各样的消息。如果窗口和调用函数在同一个线程中,除非你在特殊的界面操作函数中调用,其实界面还是应该可以刷新。...socket接收数据的另外一个函数recv则是一个阻塞调用的例子。当socket工作在阻塞模式的时候,如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据为止。...非阻塞阻塞阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

    2.2K50

    Kotlin协程系列(二)

    在使用线程开发时,如果我们想让一段代码延迟一段时间再执行,我们一般会用Thread.sleep函数,但是这个函数的缺点是它会阻塞当前线程。...因此,delay函数的实现可以确定以下两点: 不需要阻塞线程 是个挂起函数,指定时间后,能够恢复执行即可   这里,直接给出delay函数的实现,然后再作出解释: suspend fun delay(time...它会将协程的执行切换到主线程,以确保 UI 操作不会在后台线程上执行 IO调度器(Dispatchers.IO):专门用于执行涉及阻塞 IO 操作的协程,例如文件读写或网络请求。...IO 调度器使用一个专门的线程池,允许执行大量的 IO 操作而不阻塞线程 无限制调度器(Dispatchers.Unconfined):允许协程在调用挂起函数线程中继续执行,直到第一个挂起点。...同作用域:与协程作用域在协程的父子关系上一致,区别在于处于该作用域下的协程出现未捕获的异常时不会将异常向上传递给父协程。

    25310
    领券