【发布时间】:2019-05-23 18:58:51
【问题描述】:
我正在尝试处理数据对象树。每个树叶都应该通过使用协程的函数进行处理。整个过程应该使用一个固定大小的线程池来完成。
所以我想出了这个:
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) }
}
}
【问题讨论】:
-
添加
handleEntry函数的代码。 -
“加入永不返回”是指线程被阻塞并且应用程序被挂起吗?
main函数没有完成? -
是的。它将无限期地等待作业完成。我检查了:子作业确实完成并被销毁,直到主管没有任何孩子。但作业本身永远不会进入完整状态。
-
好像如果你
cancelSupervisorJob它取消了它的所有子节点,你可以等待它和它的子节点完成,然后使用join。但是当然,您在每个子作业中都会得到一个可能不需要的CancellationException,如果它调用某些suspend函数,则会导致停止执行。
标签: kotlin kotlin-coroutines jobs