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

runBlocking应该只用于测试和主函数吗?

runBlocking是Kotlin协程库中的一个函数,用于在协程中阻塞当前线程,直到协程执行完毕。它通常用于测试和主函数中,但并不仅限于这两个场景。

在测试中,runBlocking可以用来阻塞当前线程,等待协程执行完毕,以便进行断言和验证。它提供了一种简单的方式来测试协程代码的行为和结果。

在主函数中,runBlocking可以用来阻塞主线程,以确保协程执行完毕后程序不会立即退出。这在需要在协程执行完毕前保持程序运行的情况下非常有用。

除了测试和主函数,runBlocking还可以在其他场景中使用。例如,在协程中需要等待其他协程执行完毕后再继续执行某些操作时,可以使用runBlocking来阻塞当前协程。

总结来说,尽管runBlocking通常用于测试和主函数中,但它并不仅限于这两个场景,可以在其他需要阻塞当前线程的协程中使用。

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

  • 腾讯云函数(云原生Serverless计算服务):https://cloud.tencent.com/product/scf
  • 腾讯云容器服务(云原生容器化部署和管理服务):https://cloud.tencent.com/product/tke
  • 腾讯云数据库(云原生数据库服务):https://cloud.tencent.com/product/cdb
  • 腾讯云CDN(内容分发网络服务):https://cloud.tencent.com/product/cdn
  • 腾讯云安全产品(包括DDoS防护、Web应用防火墙等):https://cloud.tencent.com/product/ddos
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Kotlin 协程之Practice

// runBlocking coroutineScope 主要的不同之处在于后者在等待所有的子协程执行完毕时并没有使当前线程阻塞     private fun testCoro() = runBlocking...channel = Channel<Int>(4)//带缓冲通道,允许发送者被挂起前发射多个元素,但也会像BlockQueue会阻塞元素         //这里会消耗大量CPU,所以这这里做...{         launch { print("main runBlocking 运行在协程") }         launch(Dispatchers.Unconfined...使用专门的协程将会非常耗费资源,所以必须用完释放         launch(newSingleThreadContext("myThread")){ print("获得一个新的线程用于自身使用...runBlocking {//非受限将会协程一起工作         launch(Dispatchers.Unconfined){             print("i am working

1.2K20
  • Kotlin 协程的上下文调度器介绍-Dispatchers

    Kotlin 协程 组合挂起函数async关键字,实现协程的并发操作 (zinyan.com) 这篇继续深入了解Job。 调度器(Dispatchers )与线程 什么是调度器?...,即 runBlocking 协程 launch { println("main runBlocking : 我工作的线程 ${Thread.currentThread...挂起后,它恢复线程中的协程,而这完全由被调用的挂起函数来决定。非受限的调度器非常适用于执行不消耗 CPU 时间的任务,以及不更新局限于特定线程的任何共享数据(如UI)的协程。...例子: fun main() = runBlocking { // 非受限的——将主线程一起工作 launch(Dispatchers.Unconfined) {...非受限调度器不应该在通常的代码中使用。 Dispatchers.Default:默认调度器。默认调度器使用共享的后台线程池。

    43210

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

    Thread.sleep(5000L) } 9.2 桥接 阻塞非阻塞 上面的例子中,我们给出的是使用非阻塞的delay函数,同时有使用了阻塞的Thread.sleep函数,这样代码写在一起可读性不是那么地好...9.2.1 runBlocking函数 Kotlin中提供了runBlocking函数来实现类似协程的功能: fun main(args: Array) = runBlocking<Unit...该runBlocking函数不是用来当做普通协程函数使用的,它的设计主要是用来桥接普通阻塞代码挂起风格的(suspending style)的非阻塞代码的, 例如用在 main 函数中,或者用于测试用例代码中...9.6 协程执行的取消 我们知道,启动函数launch返回一个Job引用当前协程,该Job引用可用于取消正在运行协程: fun testCancellation() = runBlocking<...} 9.6.4 协程执行不可取消的代码块 如果我们想要上面的例子中的finally{...}完整执行,不被取消函数操作所影响,我们可以使用 run 函数 NonCancellable 上下文将相应的代码包装在

    1.1K10

    Coroutine(协程)(一)

    当然,可以使用更合乎惯用法的方式重写,使用 runBlocking 来包装 main 函数的执行: fun main() = runBlocking { // 开始执行协程 GlobalScope.launch...} println("Hello,") // 协程在这里会立即执行 delay(2000L) // 延迟 2 秒来保证 JVM 存活 } 延迟一段时间来等待另一个协程运行并不是一个好的选择...} println("Hello,") job.join() // 等待直到子协程执行结束 } 现在,结果仍然相同,但是协程与后台作业的持续时间没有任何关系 当我们使用 GlobalScope.launch....* fun main() = runBlocking { launch { doWorld() } println("Hello,") } // 这是你的第一个挂起函数 suspend...42 Completed in 2008 ms 如果 doSomethingUsefulOne 与 doSomethingUsefulTwo 之间没有依赖,并且我们想更快的得到结果,让它们进行 并发

    84410

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

    创建协程的方式 runBlocking 这是一个顶层函数,会启动一个新的协程并阻塞调用它的线程,直到里面的代码执行完毕,返回值是泛型T。...方式因为会阻塞线程,所以runBlocking函数我们在开发中基本不会使用到,但可以用于代码调试。...提前说一下asynclaunch的区别: async函数体中最后一行代码表达式运行结果会作为结果返回,也就是Deferred中的泛型T,我们可以通过其他协程函数获取到这个执行结果,而launch没有这样的返回值...Kotlin给我们提供了一个顶层函数withContext用于改变协程的上下文并执行一段代码。...isCancelled 用于判断协程是否被取消 isCompleted用于判断协程是否结束 除了获取协程状态,还有很多可以用于操纵协程的函数: cancel()取消协程。

    17210

    kotlin--协程上下文、异常处理

    finished") } jobA.join() println("main finished") } 结果: jobA finished main finished 我们在协程...所以async中的异常会作为返回值,返回给调用await函数 fun `test coroutineScope exception4`() = runBlocking { val job1 =...CoroutineScheduler.kt:742) finished Process finished with exit code 0 可以发现job3.await()的try catch并没有生效,所以向用户暴露异常用于不同上下文...5,我们可以推断,如果子协程有异常发生了,我们在等待时捕获异常后,根协程执行了挂起函数,那么它会直接中断,不执行挂起函数以下的代码,如果没有挂起函数,那么后面的代码还是会执行 为了加强验证这点,我们使用...Thread.sleep(2000)替换delay函数测试下: fun `test SupervisorHandler exception4`() = runBlocking { val handler

    94410

    【翻译】忘了RxJava吧——你需要的是拥抱Kotlin协程(Part 12)

    陡峭的学习曲线 你还记得花了多少时间来理解 map() flatMap() 之间的区别?更别说其他成千上万的操作符了。时间开销是每个新手开发人员学习进入响应式编程世界所必需面对的。...可读性 代码更易于阅读编写了,这是由于异步代码是使用同步方式编写出来的。 我该如何重构单元测试?...——我们删除了订阅函数调用,添加了 runBlocking 协程构建器——这样我们的测试就不会在测试代码还没有完全运行完之前提前退出了。...你难道不喜欢变得如此干净利落的界面?我已经做了很多了。...对于那些使用 Mockito 的朋友来说, mock 一个挂起函数的代码是这样的: given { runBlocking { apiClient.login(any()) } }.willReturn

    1.1K20

    精通协程的必会十一个高级技巧

    SupervisorJob 是一种特殊的 Job,它允许子协程失败时取消该子协程,而不影响其他子协程或父协程。...协程的扩展函数 原理 扩展函数是定义在顶层的函数,它们采用接收者类型(通常是类类型)作为参数,允许您在不修改原始类的情况下添加新的函数。在协程中,您可以通过扩展函数为协程相关的类接口添加额外的操作。...使用Channel 原理 Channel 是一种用于协程之间通信的数据结构,它允许在不同协程之间发送接收数据。...这有助于构建复杂的异步流程,以确保正确的操作顺序错误处理。 协程的测试 原理 协程的测试是确保协程的行为错误处理正确的关键步骤。...kotlinx.coroutines.test 库提供了用于测试协程的工具,例如 TestCoroutineDispatcher runBlockingTest 函数

    32640

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

    9.8.2 使用async异步并发执行 上面的例子中,如果在调用 doJob1 doJob2 之间没有时序上的依赖关系, 并且我们希望通过同时并发地执行这两个函数来更快地得到答案, 那该怎么办呢?...测试无穷质数序列: fun producePrimesSequences() = runBlocking { var producerJob = numbersProducer(...我们使用协程,程序在用户空间内切换上下文,不再陷入内核来做线程切换,这样可以避免大量的用户空间内核空间之间的数据拷贝,降低了CPU的消耗,从而大大减缓高并发场景时CPU瓶颈的窘境。...另外,使用协程,我们不再需要像异步编程时写那么一堆callback函数,代码结构不再支离破碎,整个代码逻辑上看上去同步代码没什么区别,简单,易理解,优雅。...底层 API:kotlin.coroutines 底层 API 相对较小,并且除了创建更高级的库之外,不应该使用它。

    1.2K20

    Kotlin Flow响应式编程,操作符函数进阶

    我相信应该没有任何一个人能够熟练掌握RxJava的所有操作符函数,这一点越是RxJava的老手应该越是深有体会。...34之间、45之间间隔只有100毫秒,因此都无法发送成功。5由于是最后一条数据,因此可以发送成功。 那么打印结果应该是25: 这就是debounce操作符函数的用法了。...+ value } 总体区别就这么多,所以我感觉fold函数并没有什么好讲的,它reduce函数具体用谁取决于你编程时的业务逻辑需求。...但是其实reduce函数fold函数并不是只能用作数值计算,相反它们可以作用于任何类型的数据。...那么根据collectLatest函数的规则,这条数据的剩余处理逻辑会被取消掉。因此,2不会被打印出来。 最终我们看到的打印结果应该是13: flatMap操作符函数系列到此结束。

    1.1K20

    Kotlin协程知识累计

    一、什么是协程 说明:仅限于 JVMAndroid上,协程就是一个类似安卓handlerjava中线程池的一种线程框架,协程只是对线程高级封装的API,协程的本质还是线程——协程=漂亮的多线程。...4.runBlocking {}会等待所有子协程执行完毕 2、非阻塞式挂起:就是用阻塞式的代码写法,实现了非阻塞式的功能(同步代码写法实现异步任务) runBlocking本身会阻塞当前线程去等待...5、大写的CoroutineScope没有继承runBlocking协程的上下文,所以这种情况的runBlocking不会等待子协程CoroutineScope执行完毕。...6、Flow流:是冷流,就是 Kotlin 协程与响应式编程模型结合的产物,你会发现它与 RxJava 非常像,用于替代RxJava。...从源码可知folw内是执行了挂起函数的,flow是协程中的库,只能用于协程环境。

    22310

    Android面试题之Kotlin异步流、冷流Flow

    Collect以后,发射出来的值才会实实在在的存在于内存之中,懒加载有点像 流的连续性 流的每次单独收集都是按照顺序执行的,除非使用特殊的操作符 从上游到下游每个过渡操作符都会处理每个发射出的值,然后再交给末端操作符...与序列转换为流 流上下文 流的收集总是在调用协程的上下文中发生,这个属性称为上下文保存 flow{...}构建器中的代码必须遵循上下文保存属性,并且不允许从其他上下文中发射(emit) flowOn操作符,该函数用于更改流发射的上下文...(也可以用flowOn切换上下文来实现) conflate(),合并发射项,不对每个值进行处理,比如1-3,处理13,中间的值不处理 collectLatest(),取消并重新发射最后一个值 当必须更改...collected $value") } } } 操作符 过渡流操作符 转换操作符:map、transform 限长操作符:take 末端流操作符 末端操作符是在流上用于启动流收集的挂起函数...zip操作符用于组合两个流中的相关值 2个流是异步的 @Test fun `test flow zip`() = runBlocking { val nums = (1..3).asFlow

    10110

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

    withTransaction API 在上下文中创建了三个关键元素: 单线程调度器,用于执行数据库操作; 上下文元素,帮助 DAO 函数判断其是否处在事务中; ThreadContextElement...这一点很重要,因为 executor 可以由用户来配置,并且可作为测试工具使用。在事务开始时,Room 会获得 executor 中某个线程的控制权,直到事务结束。...获取一个事务线程并不是一个阻塞操作,它也不应该是阻塞操作,因为如果没有可用线程的话,应该执行挂起操作,然后通知调用方,避免影响其他协程的执行。...然后 runBlocking 所创建的调度器会将要执行的代码块分发给已获得的线程。另外,Job 被用来挂起保持线程的可用性,直到事务执行完成为止。...如果您的 DAO 同时具有这两种类型的功能,则可以在 withTransaction 块中将阻塞函数与挂起函数混合匹配。

    1.9K20
    领券