我不确定yield
功能的目的是什么。
你能看看我的这个例子吗?
我跟随一个例子here,但无论如何。
这是代码:
val job = launch {
val child = launch {
try {
delay(Long.MAX_VALUE)
} finally {
println("Child is cancelled")
}
}
yield() //why do i need this ???????
println("Cancelling child")
child.cancel()
child.join()
yield()
println("Parent is not cancelled")
}
job.join()
当我注释掉第一个产量时,我得到以下结果:
但如果我离开收益,我得到:
在这里使用yield
意味着什么?
https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/yield.html
将当前协程调度程序的线程(或线程池)产生给其他协同程序以运行。如果协程调度程序没有自己的线程池(如Dispatchers.Unconfined),则此函数不执行任何操作,但会检查协程作业是否已完成。此暂停功能是可取消的。如果在调用此挂起函数时或在此函数等待调度时取消或完成当前协程的Job,则它将以CancellationException恢复。
它完成了至少一些事情
经过一些研究后,我发现收益实际上是来自java,产生线程的术语是我不理解的。
实质上:yield()基本上意味着线程没有做任何重要的事情,如果需要运行其他线程,它们可以运行。 (我更喜欢像Alex Yu提到的那样使用join)。基本上,如果我们想要想象什么产量正在做什么......你调用yield的任何线程将被推送到消息传递队列的后面,然后在其之前执行具有相同优先级的其他线程。所以它就像去俱乐部的后排。