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

CompletableDeferred 使用和注意事项

结论

是的,CompletableDeferred 通常需要手动调用 complete() 或 completeExceptionally(),否则调用 await() 的协程会一直保持挂起状态。

CompletableDeferred 确实不适合数据流场景。它设计用于单次的异步结果,而不是持续的数据流。

为什么 CompletableDeferred 不适合数据流

关键区别

async 启动的 Deferred - 自动完成

val deferred = async {delay(1000)"自动返回的结果"  // 这个结果会自动设置给 deferred
}
// 不需要手动 complete,async 块执行完毕会自动完成

CompletableDeferred - 需要手动完成

val deferred = CompletableDeferred<String>()
// 此时 deferred 是"空"的,没有结果// 如果不调用 complete(),await() 会永远挂起
// deferred.complete("结果")  // 如果注释掉这行...val result = deferred.await()  // 这里会永远挂起!

为什么会这样设计?

CompletableDeferred 的设计初衷就是为了手动控制完成时机

  1. 桥接回调API:等待某个回调被触发

  2. 跨协程协调:一个协程等待另一个协程的信号

  3. 外部事件驱动:等待用户操作、网络响应等外部事件

// 典型用法:等待按钮点击
val buttonClickDeferred = CompletableDeferred<Unit>()button.setOnClickListener {buttonClickDeferred.complete(Unit)  // 手动完成!
}// 在协程中等待点击
suspend fun waitForButtonClick() {buttonClickDeferred.await()  // 挂起直到有人点击按钮println("按钮被点击了!")
}

重要提醒

如果您创建了 CompletableDeferred 但忘记调用 complete()

  • await() 会永远挂起

  • 协程永远不会恢复

  • 可能导致内存泄漏(挂起的协程无法被回收)

  • 程序可能看似卡死

最佳实践

// 总是确保有完成路径
suspend fun fetchData(): String {val deferred = CompletableDeferred<String>()try {// 设置超时保护withTimeout(5000) {// 启动异步操作startAsyncOperation { result ->deferred.complete(result)  // 确保这里会被调用}return deferred.await()}} catch (e: TimeoutException) {deferred.completeExceptionally(e)  // 超时也要完成throw e}
}

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

相关文章:

  • 安贞网站建设公司烟台网站开发公司
  • 第10讲:操作符详解——掌握C语言的“运算密码”
  • 安平县哪家做网站手机站电影
  • 大淘客网站上的推广怎么做网站建设设计风格描述
  • 简述常用的网站开发软件产品设计和工业设计有什么区别
  • 建设网站制作汉狮团队wordpress mysql 挂了
  • 移动端公众号网站开发软文发稿平台有哪些
  • 计算机操作系统:操作系统的目标与作用
  • paypal客户端网站建设评价网页制作收入
  • 重庆做兼职哪个网站网页升级跳转自动刷新
  • 网站 翻页 实现网站集约化建设方案
  • 公司网站管理图片制作ppt的软件是什么
  • Altium Desinger阵列式粘贴使用
  • 临沂seo网站推广曹鹏wordpress教程 下载
  • PyQt批量年龄计算工具:从身份证到指定日期的周岁处理
  • L2TPv2-原理浅谈+报文示例+简易配置-RFC2661
  • 信息系统项目的风险管理
  • hot100-3
  • 网站推广的措施和手段有哪些网站优化顺义案例
  • CompletableDeferred、defer 和 Job 关系
  • 呼市做引产z首大网站网站设计和建设ppt
  • 做面膜的网站如何才能做好品牌网站建设策划
  • 外贸社交网站排名网站搜不出来怎么办
  • 做影视网站规模不大洛阳网站建设哪个好点
  • 《投资-82》价值投资者的认知升级与交易规则重构 - 第二层:五大财务指标的定义、分析方法、误区
  • 做网站哪家强wordpress 不用插件代码高亮
  • string类的理解和使用
  • 做羞羞网站谷歌广告联盟怎么做
  • 网站规划建设与管理维护的论文软件推广
  • 备案的网站名称可以改吗pc网站怎么做适配