我正在启动一个coroutine,我希望在恢复主线程执行之前完成。
我的代码简化看起来像这样:
fun hello() {
for (i in 0..100) {
println("hello")
}
}
fun main(args: Array<String>) {
val job = GlobalScope.launch { hello() } //launch parallel
GlobalScope.launch { job.join() } //try to wait for job to finish
print("done")
}
问题是,因为job.join()
需要在Coroutine内部,因此执行的主线被延迟到"完成",因此输出看起来像这样:
donehello
hello
hello
hello
我想等待工作完成,例如在GO中使用sync.WaitGroup
。因此,我的输出在确定性上看起来像这样:
hello
hello
hello
hello
...
done
我该如何完成?
实际上为您的样本job.join()
是确保此时等待直到给定作业完成的方法。不幸的是,您再次将其包装在GlobalScope.launch
中,这只是将其等待在背景线程中。因此,它较早地到达done
,然后您期望并在我的计算机上没有打印任何hello
(但可以(。
我假设您使用了launch
,因为join
只能从Coroutine或其他悬浮功能中调用?就您的示例而言,仅将suspend
添加到main
,例如:
suspend fun main() {
val job = GlobalScope.launch { hello() }
job.join()
print("done")
}
,或者您可以使用runBlocking
并用它包装main
,例如:
fun main() = runBlocking {
val job = launch { hello() }
job.join()
print("done")
}
现在免责声明...您可能需要在继续之前咨询以下资源(如果您还没有这样做(:
- Coroutine Basics
- 避免罗马伊丽莎白的GlobalsCope的原因
- 并发coroutines-并发不是 @s1m0nw1 的并行性