本文同步发表于微信公众号,微信搜索 程语新视界 即可关注,每个工作日都有文章更新

Kotlin 协程的构建器主要分为以下几类:

1. 基础构建器

launch

  • 返回 Job 对象,不返回结果

  • 用于执行"发射后不管"的异步操作

val job = CoroutineScope(Dispatchers.IO).launch {
    delay(1000)
    println("Task completed")
}
job.join() // 等待完成

async

  • 返回 Deferred<T>(继承自 Job),可以返回结果

  • 用于需要获取执行结果的并发操作

val deferred = CoroutineScope(Dispatchers.IO).async {
    delay(1000)
    "Result"
}
val result = deferred.await() // 获取结果

2. 运行阻塞构建器

runBlocking

  • 阻塞当前线程直到协程执行完毕

  • 主要用于桥接非协程代码和协程代码(如 main 函数、测试)

fun main() = runBlocking {
    delay(1000)
    println("Done")
}

3. 作用域构建器

coroutineScope

  • 创建一个协程作用域,会等待所有子协程完成

  • 挂起函数,不阻塞线程

suspend fun doWork() = coroutineScope {
    val job1 = launch { delay(1000) }
    val job2 = launch { delay(2000) }
    // 等待两个子协程都完成
}

supervisorScope

  • 类似于 coroutineScope,但子协程失败不会影响其他子协程

suspend fun doWork() = supervisorScope {
    val job1 = launch { throw Exception() } // 失败不影响 job2
    val job2 = launch { delay(1000) }
}

4. 生产者构建器

produce

  • 返回 ReceiveChannel,用于构建生产者-消费者模式

val channel = CoroutineScope(Dispatchers.Default).produce {
    for (i in 1..5) {
        send(i)
    }
}
channel.consumeEach { println(it) }

5. 其他常用构建器

withContext

  • 切换协程上下文,并返回结果

suspend fun fetchData() = withContext(Dispatchers.IO) {
    // 在 IO 线程执行
    "Data"
}

actor(已废弃)

  • 早期版本用于构建 actor 模型,现已废弃,推荐使用 Channel 替代

场景推荐构建器
不需要返回值launch
需要返回值async / await
切换线程withContext
顶层协程启动runBlocking(非生产环境)
结构化并发coroutineScope / supervisorScope
流式数据处理produce + consumeEach

这些构建器共同支撑了 Kotlin 协程的结构化并发模型,确保协程的生命周期被正确管理。开发中可以根据不同场景选择合适的构建器。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐