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

在这种情况下,runBlocking()不会阻塞线程

在这种情况下,runBlocking()函数不会阻塞线程。

runBlocking()是Kotlin协程库中的一个函数,用于在协程中以阻塞的方式运行代码块。它可以用于在非协程代码中调用挂起函数,或在测试中运行需要阻塞的代码。

在调用runBlocking()函数时,它会创建一个新的协程,并阻塞当前线程直到协程中的代码执行完成。但是,在这种情况下,runBlocking()函数不会阻塞线程。这是因为协程的执行是基于线程池的,它会自动管理线程的创建和调度,以充分利用系统资源。

具体来说,当我们调用runBlocking()函数时,它会启动一个新的协程,并在当前线程中执行协程代码块。但是,如果协程代码块中存在挂起函数调用,runBlocking()函数会将当前线程释放出来,让其他协程或线程继续执行。一旦挂起函数调用完成,runBlocking()函数会重新将当前线程阻塞,直到协程代码块执行完成。

总结起来,runBlocking()函数是用于在非协程代码中调用挂起函数或执行需要阻塞的代码。它不会阻塞线程,而是基于线程池来管理协程的执行。这样可以有效地利用系统资源,提高并发性能。

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

  • 腾讯云云服务器:提供稳定可靠、安全高效的云服务器实例,满足不同业务需求。
  • 腾讯云容器服务:基于 Kubernetes 的容器服务,帮助用户轻松管理和扩展容器化应用。
  • 腾讯云人工智能:提供强大的人工智能技术和服务,如语音识别、图像识别、自然语言处理等。
  • 腾讯云数据库:包括云数据库 MySQL、云数据库 MariaDB、云数据库 SQL Server、云数据库 PostgreSQL 等,满足不同的数据存储需求。
  • 腾讯云对象存储:提供安全可靠的对象存储服务,适用于图片、音视频、文档等各类数据的存储和访问。
  • 腾讯云区块链服务:提供快速部署和管理区块链网络的服务,支持多种区块链平台和应用场景。

以上是腾讯云在云计算领域的一些相关产品,可以根据具体业务需求选择合适的产品进行使用。

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

相关·内容

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

Looper.loop和主线程的关系 分析Handler和应用启动的时候讲过,创建ActivityThread时,主线程会创建Looper,并且进入Loop循环: public static void...Looper.prepareMainLooper(); Looper.loop(); 主线程阻塞 关于死循环 主线程进入一个死循环,是不是就会被阻塞?...你不给我消息,我就会阻塞,减少CPU消耗(涉及到epoll)。 那么主线程会响应什么消息呢?...ActivityThread里有一个命名为H的handler,它处理所有Activity生命周期有关的事件。因为主线程就是UI线程,当UI发生变化,相关消息就会传进来,Looper就会处理消息。...所以: Looper的阻塞,前提是没有输入事件,此时MessageQueue是空的,Looper进入空闲,线程进入阻塞,释放CPU,等待输入事件的唤醒。

2.7K10

Android面试题之Kotlin协程一文搞定

协程基于线程,是轻量级的线程 作用 处理耗时任务,这种任务常常会阻塞线程 保证主线程安全,即确保安全地从主线程调用任何suspend函数 特点 让异步逻辑同步化 最核心的点就是,函数或者一段程序能够被挂起...,稍后再在挂起得位置恢复 挂起函数 使用suspend关键字修饰的函数 挂起函数只能在协程体内或其他挂起函数内调用 挂起和阻塞的区别 挂起不会阻塞线程,主线程可以正常刷新UI,但阻塞就会导致主线程ANR...若 async 已经有结果了,await() 则直接获取其结果并赋值给变量,此时不会挂起协程 构建器 是否立即启动? 串行?并行? 是否阻塞当前线程?...,因为UNDISPATCHED会立即在当前线程中执行,而runBlocking线程中 协程作用域构建器 coroutineScope、runBlocking、supervisorScope runBlocking...是常规函数,会阻塞当前线程;coroutineScope是挂起函数,不会阻塞当前线程 它们都会等待协程体以及所有子协程结束,一个是阻塞线程等待,一个是挂起等待 协程作用域构建器 coroutineScope

9210

Kotlin 协程之Practice

协程的状态与生命周期都是Job反应出来的         val job = GlobalScope.launch {//使用launch启动一个协程             //delay 是挂起函数,不会造成线程阻塞...}         Log.i(tag,"hello")//主线程协程将继续等待,主线程代码立即执行 //        Thread.sleep(2000L)//阻塞线程2秒,保证...JVM存活 //        runBlocking {//阻塞线程2秒,保证JVM存活 //            delay(2000L) //        } //        delay...// runBlocking 和 coroutineScope 主要的不同之处在于后者等待所有的子协程执行完毕时并没有使当前线程阻塞     private fun testCoro() = runBlocking...,执行完成,调用挂起函数进行阻塞,这种异步函数编程风格协程中不受欢迎             val one = doSomeAsync()             val two = doSomeAsync2

1.2K20

Kotlin语言基础入门到熟悉:Kotlin协程基础

阻塞与非阻塞 **runBlocking** delay是非阻塞的,Thread.sleep是阻塞的。显式使用 runBlocking 协程构建器来阻塞。...") runBlocking {     // 这个表达式阻塞了主线程 delay(3000L)  //阻塞线程防止过快退出 } println("\n示例结束") } 可以看到,runBlocking...用了runBlocking的主线程会一直**阻塞**直到runBlocking内部的协程执行完毕。 也就是runBlocking{ delay }实现了阻塞的效果。...("协程1执行完毕") } launch { // runBlocking 作用域中启动一个新协程2 println("协程2所在线程id ${Thread.currentThread(...全局协程像守护线程 如果进程中只剩下了守护线程,那么虚拟机会退出。 前文那个的例子,其实也能看到,字符没打印完程序就结束了。 **GlobalScope** 中启动的活动协程并不会使进程保活。

79300

Kotlin---协程的使用

DefaultDispatcher-worker-1 @coroutine#1 可以看到通过GlobalScope.launch完成了: 启动了新的线程线程中创建了一个协程@coroutine#1...并且这样执行的协程,并不会阻塞线程的执行 delay函数只能在协程中使用,否则编译不过,尽量避免使用GlobalScope.launch创建协程,当我们使用 GlobalScope.launch 时...阻塞的协程runBlocking GlobalScope.launch启动了一个线程创建新的协程,并没有阻塞当前线程。...而如果想要在当前线程创建协程的话,则需要使用runBlocking runBlocking { launch { Log.e(TAG,"${Thread.currentThread...中调用delay()会阻塞当前线程 runBlocking中调用launch()会开启新的协程,并且不会阻塞当前线程 runBlocking中调用launch()会在当前线程中执行协程 main @

1.3K20

Kotlin 协程和 Android SQLite API 中的线程模型

但当这个查询另外一个线程中被执行时,那它就不再属于这个事务的一部分了,这样的话就会导致这个查询被阻塞,直到事务另外一个线程执行完成。...当数据库的事务操作都是一个线程上完成的,这样的 API 不会有任何问题,但是使用协程之后问题就来了,因为协程是不绑定在任何特定的线程上的。...在这种情况下,一旦之前入队列的 runnable 执行了,就代表着一个线程可用,我们会使用 runBlocking 启动一个事件循环来获取此线程的控制权。...Room 中的阻塞函数,包含 DAO 生成的那些,它们被事务协程调用后会被特殊处理,用来保证它们不会在其他的调度器上运行。...之后,我们计划将阻塞函数也重新路由到事务线程中。

1.8K20

Coroutine(协程)(三)

其中一个不同是它代替了阻塞的 put 操作并提供了挂起的 send,还替代了阻塞的 take 操作并提供了挂起的 receive。...类 其实这个问题在java中也是这么处理的 1.以细粒度限制线程 限制线程 是解决共享可变状态问题的一种方案:对特定共享状态的所有访问权都限制单个线程中。...2.以粗粒度限制线程 在实践中,线程限制是大段代码中执行的,例如:状态更新类业务逻辑中大部分都是限于单线程中。下面的示例演示了这种情况, 线程上下文中运行每个协程。...3.互斥 该问题的互斥解决方案:使用永远不会同时执行的 关键代码块 来保护共享状态的所有修改。阻塞的世界中,你通常会为此目的使用 synchronized 或者 ReentrantLock。...协程中的替代品叫做 Mutex 。它具有 lock 和 unlock 方法, 可以隔离关键的部分。关键的区别在于 Mutex.lock() 是一个挂起函数,它不会阻塞线程

50820

kotlin--协程的启动和取消

,那么不会马上执行,4则不依赖调度器 1.DEFAULT:取消后,将不会再执行 fun `test start mode`() = runBlocking { val job = launch(...与coroutineScope runBlocking是常规函数,它会阻塞线程,而coroutineScope是挂起函数,它们都会等待其协程体和子协助执行结束,作用域构建器使用的是父协程的上下文,协程的上下文会在下一篇中重点介绍...1200ms,因为runBlocking不会等自定义作用域执行完毕 delay(1200) scope } 2.被取消的子协程,不影响其他兄弟协程 fun `test cancel`()...{ //指定别的调度器,不然会阻塞runBlocking val job = launch (Dispatchers.Default){ var count = 0...此外,它还会尝试让出线程的执行权,给其他协程提供执行机会 fun `test cancel cpu yield`() = runBlocking { //指定别的调度器,不然会阻塞runBlocking

96730

【Kotlin 协程】协程启动 ② ( 多协程控制 | launch 协程执行顺序控制 | Job#join() 函数 | async 协程执行顺序控制 | Deferred#await() 函数 )

{ // 调用 runBlocking 函数 , 可以将 主线程 包装成 协程 val launchJob = launch { // 调用该挂起函数延迟 100 ms...ms delay(100) Log.i(TAG, "launchJob1 执行完毕") } } Job#join() 函数原型如下 : 该函数是挂起函数 , 不会阻塞线程...{ // 调用 runBlocking 函数 , 可以将 主线程 包装成 协程 val asyncDeferred = async { // 调用该挂起函数延迟 100...delay(50) Log.i(TAG, "asyncDeferred1 执行完毕") } } Deferred#await() 函数原型如下 : 该函数是挂起函数 , 不会阻塞线程...; /** * 阻塞线程情况下等待该值的完成,并在延迟的计算完成时恢复, * 返回结果值,如果取消了延迟,则抛出相应的异常。

89220

Coroutine(协程)(二)

i) // 产生下一个值 } } fun main() { simple().forEach { value -> println(value) } } 2.挂起函数 上线的代码会阻塞线程...当这些值由异步代码计算时,我们可以使用 suspend 修饰符标记函数 simple, 这样它就可以阻塞情况下执行其工作并将结果作为列表返回: suspend fun simple(): List... { // 启动并发的协程以验证主线程并未阻塞 launch { for (k in 1..3) { println("I'm not...这种方式大约花费了 1000 毫秒来运行: 13.处理最新值collectLatest 当发射器和收集器都很慢的时候,合并是加快处理速度的一种方式。它通过删除发射值来实现。...onCompletion 能观察到所有异常并且仅在上游流成功完成(没有取消或失败)的情况下接收一个 null 异常。

55010

Kotlin协程开篇

// 延迟后打印输出 } println("Hello,") // 协程已在等待时主线程还在继续 Thread.sleep(2000L) // 阻塞线程 2 秒钟来保证 JVM...Android中我们对IO操作的一个熟知的规则是不能写在主线程中,因为它会卡线程,导致ANR。而上面的代码其实是不会线程的。用同步的方式写异步代码 这句话很多资料中出现过,划重点。...理解这句话的关键在于,协程干了什么,让这个异步操作不会卡主线程? 我们知道类似的技术RxJava中也有,它通过手动切线程的方式指定代码运行所在的线程,从而达到不卡主线程的目的。...协程中有一个函数 runBlocking{},没接触过的可以简单理解为它等价于launch{}。...对于程序员来说,再也不用关心什么时候切协程,协程什么线程运行这种问题,开发效率和代码运行效率得到成倍提升。 golang在编译器上做了很多优化,当代码中发生IO或者内核中断的时候,会自动帮你切协程。

88320

Kotlin协程知识累计

执行一个挂起函数,执行完挂起函数任务后会切换回该协程调度器指定的线程中去(也可能是切回原来的线程中去),挂起函数和协程都可以通过调度器指定运行在不同的线程。...4.runBlocking {}会等待所有子协程执行完毕 2、非阻塞式挂起:就是用阻塞式的代码写法,实现了非阻塞式的功能(同步代码写法实现异步任务) runBlocking本身会阻塞当前线程去等待...async协程默认是等待状态的,创建后不会立即执行会有延迟,但是如果调用.await()方法会立即执行并且是阻塞父协程的;如果设置了启动模式async(start = CoroutineStart.LAZY...5、大写的CoroutineScope没有继承runBlocking协程的上下文,所以这种情况的runBlocking不会等待子协程CoroutineScope执行完毕。...1.首先,使用发送消息来同步信息相比于直接使用共享内存和互斥锁是一种更高级的抽象,使用更高级的抽象能够为我们程序设计上提供更好的封装,让程序的逻辑更加清晰; 2.其次,消息发送解耦方面与共享内存相比也有一定优势

19410

《Kotin 极简教程》第9章 轻量级线程:协程(2)《Kotlin极简教程》正式上架:

的context的协程继续线程中执行; 而CommonPoolForkJoinPool.commonPool中; 我们使用newSingleThreadContext函数新建的协程上下文,该协程运行在自己的新线程...协程并不是取代线程, 而且抽象于线程之上, 线程是被分割的CPU资源, 协程是组织好的代码流程, 协程需要线程来承载运行, 线程是协程的资源, 但协程不会直接使用线程, 协程直接利用的是执行器(Interceptor...协程提供了一种避免阻塞线程并用更廉价、更可控的操作替代线程阻塞的方法:协程挂起。 协程通过将复杂性放入库来简化异步编程。程序的逻辑可以协程中顺序地表达,而底层库会为我们解决其异步性。...该库可以将用户代码的相关部分包装为回调、订阅相关事件、不同线程(甚至不同机器)上调度执行,而代码则保持如同顺序执行一样简单。 9.14.1 阻塞 vs 挂起 协程可以被挂起而无需阻塞线程。...而线程阻塞的代价通常是昂贵的,尤其高负载时,阻塞其中一个会导致一些重要的任务被延迟。 另外,协程挂起几乎是无代价的。不需要上下文切换或者 OS 的任何其他干预。

1.2K20

【Kotlin 协程】协程启动 ④ ( 协程启动模式 | 协程构建器启动模式参数 | DEFAULT 模式 | ATOMIC 模式 | LAZY 模式 | UNDISPATCHED 模式 )

这种情况下, * 结果[Deferred]是_new_状态下创建的。它可以显式地以[start][Job.start]开始 * 函数,并将在第一次调用[join][Job时隐式启动。..., 协程挂起后 , 主线程继续执行其它任务, 如刷新 UI 等 , 主线程不会阻塞 , 挂起函数会在子线程中执行 ; 一般会将耗时操作放在 协程的挂起函数 中执行 ; 2、ATOMIC 模式 ATOMIC...{ // 调用 runBlocking 函数 , 可以将 主线程 包装成 协程 // 指定协程的启动模式为 CoroutineStart.LAZY // 协程创建后 , 不会马上开始调度执行...* * 如果协程[Job]它甚至有机会开始执行之前被取消,那么它将不会启动它的 * 执行,但将以异常完成。...,嵌套的未分派协程不会形成 * 无限制嵌套的情况下防止潜在堆栈溢出的事件循环。

99510

TransmittableThreadLocal使用线程池等会缓存线程的组件情况下传递ThreadLocal

1、简介 TransmittableThreadLocal 是Alibaba开源的、用于解决 “使用线程池等会缓存线程的组件情况下传递ThreadLocal” 问题的 InheritableThreadLocal...下面分析下InheritableThreadLocInheritableThreadLocal类重写了ThreadLocal的3个函数: /** * 该函数线程创建子线程,向子线程复制InheritableThreadLocal...这种方式,实现线程池的传递是透明的,代码中没有修饰Runnable或是线程池的代码。...) 修饰实现代码TtlForkJoinTransformlet.java java.util.TimerTask的子类(对应的线程池组件是java.util.Timer) 修饰实现代码TtlTimerTaskTransformlet.java...如支持配置线程池的大小(Timer只有一个线程);TimerRunnable中抛出异常会中止定时执行。更多说明参见10.

1.6K20

Kotlin | 协程使用手册(不间断更新)

GlobalScope.launch { delay(1000) println(123) }.join() println(1231) delay 特殊的挂起函数,它并不会造成函数阻塞...,但是会挂起协程 协程作用域构建器 runBlocking阻塞当前线程,直到协程结束。...23") } } coroutineScope 只是挂起,会释放底层线程用于其他用途,并不会阻塞线程。...我们上面的代码中,suspend 我们经常见。 Flow 使用list返回结果,意味着我们会一次返回所有值,而使用Sequence虽然可以做到同步返回,但如果有耗时操作,又会阻塞我们的线程。...协程中的取消操作总是通过抛出异常来执行,这样所有的资源管理函数(try{},finally{}块 会在取消的情况下正常运行 take 获取指定个数的发射个数,到达上限将停止发射 runBlocking

2.3K20

《Kotin 极简教程》第9章 轻量级线程:协程(1)

后来,我们又使用异步回调的方式来实现非阻塞,但是异步回调代码写起来并不简单。 协程提供了一种避免阻塞线程并用更简单、更可控的操作替代线程阻塞的方法:协程挂起。...另外,这里的delay()函数类似Thread.sleep()的功能,但更好的是:它不会阻塞线程,而只是挂起协程本身。...如果这个阻塞线程被中断,runBlocking抛出InterruptedException异常。...所谓守护 线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。...我们可以看出,活动的协程不会使进程保持活动状态。它们的行为就像守护程序线程

1.1K10
领券