鉴于这段代码
fun main() {
val job = Job()
val scope = GlobalScope + job
scope.launch {
println("working!")
delay(1000L)is ms)
println("done!")
// how do i finish the job originally associated with this scope?
}
runBlocking {
job.join()
println("job done")
}
}
我的应用程序有一个自定义协同程序范围,我正在将这个作用与这个作用域相关联,因为我希望从这个作用域创建的所有新协程都是这个作业的子代,如果我取消它我希望其中的所有内容都被取消。
但主要工作本身永远不会完成。完成任务后如何完成主要工作?或者失败了......
有几个函数可以等待Job()
对象完成并取消它。您可以从列表中选择一个
job.cancel()
job.join()
job.cancelAndJoin()
只有第一个函数不是suspend
函数,所以你可以从其他所有函数调用它,不一定是suspend
函数
有一种更好的方法 - launch{..}
函数已经从调用中返回Job
对象。您可以简化代码来说明
val job = GlobalScope.launch { .. }
当启动块结束或因异常而失败时,Job
对象将自动完成
主要工作仅作为父工作,永远不会完成。但你可以等所有孩子完成:
runBlocking {
job.children.forEach { it.join() }
println("job done")
}
或者你应该选择Eugene的解决方案并调用你刚刚开始的join
的Job
方法,而不是主要的工作。