我正在启动一个协程,我希望它在恢复执行主线程之前完成。
我的代码简化如下:
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()
需要在协程内,执行的主线被推迟到“完成”,因此输出如下所示:
donehello
hello
hello
hello
我想等待作业完成,例如使用sync.WaitGroup
在围棋中。所以我的输出肯定是这样的:
hello
hello
hello
hello
...
done
我该如何实现这个目标?
实际上对于你的样品job.join()
是确保此时它等待给定作业完成的方法。不幸的是你把它装在一个GlobalScope.launch
再次,这只是将其置于后台线程中等待。因此它达到了done
比你预期的更早,在我的机器上它甚至没有打印任何内容hello
(但可以)。
我假设你用过launch
因为join
只能从协程或另一个挂起函数中调用?对于您的示例,只需添加就足够了suspend
to main
, e.g.:
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")
}
现在是免责声明...在继续之前您可能需要查阅以下来源(如果您还没有这样做):
- 协程基础知识 https://kotlinlang.org/docs/reference/coroutines/basics.html#coroutine-basics
-
避免 GlobalScope 的原因 https://medium.com/@elizarov/the-reason-to-avoid-globalscope-835337445abc by 罗曼·伊利扎罗夫 https://stackoverflow.com/users/1051598/roman-elizarov
-
并发协程——并发不是并行 https://kotlinexpertise.com/kotlin-coroutines-concurrency/ by @s1m0nw1 https://stackoverflow.com/users/8073652/s1m0nw1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)