kotlin - 所有生产者协程完成后如何关闭通道?
问题描述
考虑以下代码:
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.*
fun main() = runBlocking<Unit> {
val channel = Channel<String>()
launch {
channel.send("A1")
channel.send("A2")
log("A done")
}
launch {
channel.send("B1")
log("B done")
}
launch {
for (x in channel) {
log(x)
}
}
}
fun log(message: Any?) {
println("[${Thread.currentThread().name}] $message")
}
原始版本的接收器协程是这样的:
launch {
repeat(3) {
val x = channel.receive()
log(x)
}
}
它预计频道中只有 3 条消息。如果我将其更改为第一个版本,那么我需要在所有生产者协程完成后关闭通道。我怎样才能做到这一点?
解决方案
一个可能的解决方案是创建一个等待所有人channel.send()
完成的作业,然后调用channel.close()
该invokeOnCompletion
作业的:
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.*
fun main() = runBlocking<Unit> {
val channel = Channel<String>()
launch {
launch {
channel.send("A1")
channel.send("A2")
log("A done")
}
launch {
channel.send("B1")
log("B done")
}
}.invokeOnCompletion {
channel.close()
}
launch {
for (x in channel) {
log(x)
}
}
}
fun log(message: Any?) {
println("[${Thread.currentThread().name}] $message")
}
推荐阅读
- php - 我想在 php 中将 SimpleXMLElement 对象转换为 XML
- angular - Safari 中的 Ngx-chart 高度问题
- ember.js - Ember:无法识别 camelCase 助手引用
- tensorflow - 如何在bert中设置特定的gpu?
- python - 运输错误:运输错误(503,'search_phase_execution_exception')
- java - 如何使用正则表达式提取java方法参数
- abap - CL_SALV_BS_RUNTIME_INFO 通过 RFC 返回空引用
- r - 在 foreach 循环中并行执行 autoML 时出现 H2O“网格:无法将新模型附加到具有不同训练输入的网格”错误
- javascript - 即使 api 失败,也正在执行 fetch `then()`
- c# - WPF DataGrid 性能 - 过滤器性能