kotlin - 如何加入 Kotlin 主管工作

标签 kotlin kotlinx.coroutines

我正在尝试处理数据对象树。每个树叶都应该通过使用协程的函数进行处理。整个过程应该使用固定大小的线程池来完成。

所以我想出了这个:

val node = an instance of WorkspaceEntry (tree structure)
val localDispatcher = newFixedThreadPoolContext(16)

fun main() {
    val job = SupervisorJob()
    val scope = CoroutineScope(localDispatcher + job)
    handleEntry(node, scope)

    runBlocking {
        job.join()
    }
}

handleEntry 方法在主管中为每个树叶递归地启动一个子作业。

主管的子作业全部成功完成,但连接永远不会返回。我理解错了吗?

编辑:HandleEntry 函数
private fun handleEntry(workspaceEntry: WorkspaceEntry, scope: CoroutineScope) {
    if (workspaceEntry is FileEntry) {
        scope.launch {
            FileTypeRegistry.processFile(workspaceEntry.fileBlob)
        }
    } else {
        workspaceEntry.children.forEach { child -> handleEntry(child, scope) }
    }
}

最佳答案

看来Job用于创建 CoroutineContext (在您的情况下 SupervisorJob )不用于等待子协程完成,因此您不能使用 job.join() .我猜 Job 的主要意图是取消子协程。换 runBlocking阻止以下内容将起作用:

runBlocking {
    job.children.forEach {
        it.join()
    }
}

关于kotlin - 如何加入 Kotlin 主管工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53916377/

相关文章:

Android,类型参数列表适配器

android - 提取所有图库图像并在android应用中显示

android - 有什么方法可以通过 kotlin-extensions 更改自动创建的 View 的名称?

rest - 节流或限制 Kotlin CoRoutine 计数

android - 将项目更新为稳定的协程 Kotlin 1.3.0 + Coroutines 1.0.0 错误

android - 如何将 Android 任务转换为 Kotlin Deferred?

serialization - 反序列化后Kotlin枚举无法转换

kotlin - "overloading"中的 "operator overloading"只是语义吗?

Kotlin 异步与启动