Kotlin - coroutine yield()它的目的是什么?

问题描述 投票:1回答:2

我不确定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意味着什么?

kotlin coroutine
2个回答
2
投票

https://kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core/kotlinx.coroutines/yield.html

将当前协程调度程序的线程(或线程池)产生给其他协同程序以运行。如果协程调度程序没有自己的线程池(如Dispatchers.Unconfined),则此函数不执行任何操作,但会检查协程作业是否已完成。此暂停功能是可取消的。如果在调用此挂起函数时或在此函数等待调度时取消或完成当前协程的Job,则它将以CancellationException恢复。

它完成了至少一些事情

  1. 它暂时优先处理当前长时间运行的CPU任务,为其他任务提供公平的运行机会。
  2. 检查当前作业是否被取消,否则在严格的CPU绑定循环中,作业可能不会检查到最后。
  3. 允许进行子作业,因为有多个作业而不是线程存在争用。在当前工作应根据其他工作的进展进行调整的情况下,这可能很重要。

1
投票

经过一些研究后,我发现收益实际上是来自java,产生线程的术语是我不理解的。

实质上:yield()基本上意味着线程没有做任何重要的事情,如果需要运行其他线程,它们可以运行。 (我更喜欢像Alex Yu提到的那样使用join)。基本上,如果我们想要想象什么产量正在做什么......你调用yield的任何线程将被推送到消息传递队列的后面,然后在其之前执行具有相同优先级的其他线程。所以它就像去俱乐部的后排。

© www.soinside.com 2019 - 2024. All rights reserved.