Ключевое слово yield

Ключевое слово yield используется внутри корутин для добровольной приостановки текущей корутины и предоставления возможности выполнения другим корутинам, работающим в том же диспетчере. Это позволяет реализовать кооперативную многозадачность.

Импорт

kotlinimport kotlinx.coroutines.yield

Синтаксис

kotlinsuspend fun yield(): Unit

Пример

Простое использование yield для приостановки корутины:

kotlinimport kotlinx.coroutines.*

fun main() = runBlocking {
  launch {
    for (i in 1..3) {
      println("Coroutine 1: $i")
      yield()
    }
  }
  
  launch {
    for (i in 1..3) {
      println("Coroutine 2: $i")
      yield()
    }
  }
}

Результат выполнения кода:

kotlinCoroutine 1: 1
Coroutine 2: 1
Coroutine 1: 2
Coroutine 2: 2
Coroutine 1: 3
Coroutine 2: 3

Пример

Использование yield в цикле для обработки длительных операций:

kotlinimport kotlinx.coroutines.*

fun main() = runBlocking {
  val job = launch {
    for (i in 1..1000) {
      if (i % 100 == 0) {
        println("Processed $i items")
        yield()
      }
    }
  }
  job.join()
}

Результат выполнения кода:

kotlinProcessed 100 items
Processed 200 items
Processed 300 items
Processed 400 items
Processed 500 items
Processed 600 items
Processed 700 items
Processed 800 items
Processed 900 items
Processed 1000 items

Пример

yield в комбинации с другими функциями приостановки:

kotlinimport kotlinx.coroutines.*

suspend fun processItem(item: Int) {
  println("Processing item $item")
  delay(100)
  yield()
}

fun main() = runBlocking {
  val items = listOf(1, 2, 3, 4, 5)
  
  items.forEach { item ->
    launch {
      processItem(item)
    }
  }
}

Результат выполнения кода:

kotlinProcessing item 1
Processing item 2
Processing item 3
Processing item 4
Processing item 5

Смотрите также

  • функцию launch,
    которая запускает новую корутину
  • функцию async,
    которая запускает корутину с возвратом результата
  • функцию delay,
    которая приостанавливает корутину на указанное время
  • модификатор suspend,
    который обозначает функции приостановки