(Kotlin协程十四)如何将一个协程切换到另一个线程?withContext 的工作原理?

在 Kotlin 协程中切换线程是一项非常常见且高效的操作。其核心方法是使用 withContext 这个挂起函数。理解如何切换只是第一步,更重要的是理解 withContext 是如何在底层优雅且高效地完成这一工作的,这涉及到挂起函数的 CPS 转换、状态机以及协程调度器的协同工作。"


第一部分:如何切换线程?

在协程中,你永远不会直接"操作线程",而是通过协程调度器来指定代码块应该运行在哪个线程或线程池上。

主要方法:withContext

withContext 是最常用、最推荐的线程切换方式。

kotlin

suspend fun someSuspendingFunction() {
    // 默认在父协程的上下文中执行(比如在主线程)
    doUiWork()

    // 使用 withContext 切换到 IO 线程池执行耗时 IO 操作
    val result = withContext(Dispatchers.IO) {
        performNetworkRequest() // 这个函数会在 IO 线程运行
    }

    // 执行完后,自动切回原来的上下文(主线程)
    updateUi(result)
}

特点:

  • 挂起非阻塞:它会挂起当前协程,而不是阻塞当前线程。

  • 自动切回:当 withContext 块中的代码执行完毕后,协程会自动恢复到原来的调度器上继续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值