当前位置: 首页 > news >正文

Kotlin 协程中常见的异步返回与控制方式(速览)

简介:协程里“返回/发送/控制异步结果”的手段很多,按用途可分为:启动与获取结果、超时与取消、流/多值、通道/生产者-消费者、选择(select)、回调桥接、同步/并发原语、异常与结构化并发、组合操作等。下面按类别列出关键点与示例。


1. 启动 & 获取返回值

  • launch:启动,无直接结果(返回 Job)。
  • async / await:启动并返回 Deferred,可 await 拿到结果。
  • runBlocking:阻塞式启动(通常测试/顶层)。
  • withContext:切换上下文并返回结果(类似同步调用)。

// launch / async / withContext
launch {
    val d = async { compute() }
    val r = d.await()
    val x = withContext(Dispatchers.IO) { ioWork() }
}

2. 结构化并发与作用域

  • coroutineScope:挂起当前协程直到内部子协程结束。
  • supervisorScope / SupervisorJob:子协程失败不传播到兄弟。
  • Job / CompletableJob:手动控制生命周期、cancel、join、invokeOnCompletion。

coroutineScope {
    launch { /* 子任务 */ }
}
supervisorScope {
    launch { /* 失败隔离 */ }
}

3. 超时与取消

  • withTimeout / withTimeoutOrNull:限定时长(抛异常或返回 null)。
  • cancel / cancelAndJoin / isActive / ensureActive:主动取消与检查。
  • suspendCancellableCoroutine:实现可取消的挂起桥接。

val r = withTimeoutOrNull(1000) {
    longWork()
}
if (r == null) { /* 超时 */ }

4. 单值/多值响应(Flow 与变体)

  • Flow + emit/collect:冷流,懒计算,多值流式输出。
  • SharedFlow / StateFlow:热流,状态或广播(tryEmit / emit)。
  • callbackFlow:把回调转为 Flow(可 send/trySend)。

val f = flow {
    emit(1)
    emit(2)
}
f.collect { println(it) }

5. 通道(Channel)与生产者-消费者

  • Channel / send / receive / trySend:显式缓冲或无缓冲通道。
  • produce / actor:基于 Channel 的协程构造(生产/消费模式)。

val ch = Channel<Int>()
launch { ch.send(1) }
launch { println(ch.receive()) }


6. 选择(select)

  • select 表达式:在多个 await/receive/timeout 等异步源中选第一个完成的。
  • onAwait / onReceive / onTimeout 等分支。

select<Unit> {
    deferred.onAwait { println("deferred done") }
    channel.onReceive { println("received $it") }
    onTimeout(500) { println("timeout") }
}


7. 回调 / 阻塞 API 的桥接

  • suspendCoroutine / suspendCancellableCoroutine:把回调 API 或异步回调封装为挂起函数。
  • CompletableDeferred:手动完成的 Deferred(外部完成/失败)。

suspend fun awaitCallback(): String = suspendCancellableCoroutine { cont ->
    api.call { result -> cont.resume(result) }
}

 


8. 同步与并发原语

  • Mutex / withLock:互斥保护协程内共享状态。
  • Semaphore:并发限流。
  • 原子操作(AtomicFU / java.util.concurrent 原语)。

val mutex = Mutex()
mutex.withLock { /* 线程安全写 */ }


9. 异常处理与容错

  • CoroutineExceptionHandler:未捕获异常处理(用于顶层)。
  • supervisorScope / SupervisorJob:隔离失败,避免全局取消。
  • try/catch:在协程体内捕获异常以返回默认值。

val handler = CoroutineExceptionHandler { _, e -> log(e) }
launch(handler) { throw RuntimeException("oops") }


10. Flow 的组合与操作符(常用)

  • combine、zip:合并多个 Flow。
  • flatMapConcat / flatMapMerge / flatMapLatest:映射并展平。
  • buffer / conflate / debounce / throttle:控制背压与频率。

flowA.combine(flowB) { a, b -> a + b }.collect { println(it) }

11. 其他辅助工具

  • CompletableDeferred:手动完成一个结果(类似 Promise)。
  • awaitAll / invokeAll:等待多个 Deferred。
  • produce/actor:构建基于 Channel 的高级组件。

val d1 = async { 1 }
val d2 = async { 2 }
val sum = awaitAll(d1, d2).sum()


选型建议(快速参考)

  • 只需启动后台任务且不关心返回:launch。
  • 需要返回值并组合并发任务:async/await 或 withContext。
  • 多值/流式数据:Flow(StateFlow/SharedFlow 用于状态/广播)。
  • 协程间点对点:Channel;转换回调:callbackFlow / suspendCancellableCoroutine。
  • 需要在多个异步源中取最快:select。
  • 需要超时容错:withTimeoutOrNull(返回 null 更安全)。
  • 并发共享资源需同步:Mutex.withLock。

结语:上面覆盖了工程中常用的大多数工具与模式(不是标准库 API 的完全穷尽,但足够支持绝大多数场景)。如果你有具体场景(比如“如何在超时后取消多个正在运行的网络请求并清理资源”或“如何把第三方回调库改造成 Flow”),告诉我,我给出完整示例代码。

http://www.dtcms.com/a/520716.html

相关文章:

  • 做网站还有前景么动漫网页设计报告
  • Maven 多配置文件的使用
  • 【双机位A卷】华为OD笔试之【哈希表】双机位A-跳房子I【Py/Java/C++/C/JS/Go六种语言】【欧弟算法】全网注释最详细分类最全的华子OD真题题解
  • SQL 拼接完全指南
  • 制作的网站wordpress还是自己写
  • 【HLS】Java实现统计HLS的m3u8清单中所有ts切片的视频持续时长
  • 免费网站建设ppt模板下载山西省建设银行网站首页
  • 增城网站建设价格郑州seo
  • 【Rust实战】从零构建高性能异步Web服务器:深入理解所有权与生命周期
  • Vlan-ACCESS接口+Trunk接口
  • 网站开发遇到的最大困难被k掉的网站怎么做才能有收录
  • SpringBoot-Web开发之文件上传
  • 5.2 类
  • 厦门协会网站建设电影网站做淘客
  • 网站建设介绍书如何注销公司流程及费用
  • 阿里国际站网站建设wordpress mysql 扩展
  • LeetCode 405 - 数字转换为十六进制数
  • 漳州做网站喊多少钱wordpress栏目更改无法显示
  • 集团公司网站欣赏如何做企业网站内链
  • 未来的 AI 操作系统(九)——灵魂架构:当智能系统拥有“自我”
  • 卡码网语言基础课(Python) | 20.排队取奶茶
  • ManySpeech —— 使用 C# 开发人工智能语音应用
  • 5G-A 与 5G 对比
  • 网站建设与 宣传关系wordpress 订单
  • Linux进程信号(贰):保存信号
  • 互联网站建设 天津台州网站建设惠店
  • 基于Python大数据的主流汽车价格分析可视化系统
  • Flutter状态管理原理详解
  • 如何选择网站项目企业营销推广怎么做
  • MCP Server 启动和应用