Ключевое слово yield
Ключевое слово yield используется внутри корутин
для добровольной приостановки текущей корутины и предоставления
возможности выполнения другим корутинам, работающим в том же
диспетчере. Это позволяет реализовать кооперативную многозадачность.
Импорт
import kotlinx.coroutines.yield
Синтаксис
suspend fun yield(): Unit
Пример
Простое использование yield для приостановки корутины:
import 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()
}
}
}
Результат выполнения кода:
Coroutine 1: 1
Coroutine 2: 1
Coroutine 1: 2
Coroutine 2: 2
Coroutine 1: 3
Coroutine 2: 3
Пример
Использование yield в цикле для обработки длительных операций:
import kotlinx.coroutines.*
fun main() = runBlocking {
val job = launch {
for (i in 1..1000) {
if (i % 100 == 0) {
println("Processed $i items")
yield()
}
}
}
job.join()
}
Результат выполнения кода:
Processed 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 в комбинации с другими функциями приостановки:
import 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)
}
}
}
Результат выполнения кода:
Processing item 1
Processing item 2
Processing item 3
Processing item 4
Processing item 5