Буфер канала в Kotlin
Rendezvous-канал принимает следующий send
только после готового receive. Если нужно
накопить несколько элементов, в конструктор
Channel передают положительную
вместимость - число слотов в буфере.
Пока занято меньше слотов, чем задано, send
завершается сразу и не ждет встречного приема.
Так можно подряд положить несколько меток в одной
корутине:
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
val tray = Channel<String>(2)
tray.send("alpha")
tray.send("beta")
println("queued")
}
}
Строка "queued" появляется без предварительного
receive: оба элемента поместились в буфер
из двух ячеек. Третий send в такой
конфигурации уже приостановил бы корутину, пока
кто-то не освободит место.
Прием снимает значения в порядке очереди FIFO.
После серии отправок достаточно двух receive,
чтобы увидеть сохраненный порядок:
import kotlinx.coroutines.channels.Channel
import kotlinx.coroutines.runBlocking
fun main() {
runBlocking {
val tray = Channel<String>(2)
tray.send("alpha")
tray.send("beta")
println(tray.receive())
println(tray.receive())
}
}
Сначала печатается "alpha", затем
"beta". Буфер опустошился, и канал снова
ведет себя как очередь с ограниченным запасом
между сторонами.
Создайте канал символов с вместимостью 3.
В runBlocking отправьте подряд буквы
"x", "y", "z" без
приема между ними, затем выведите все три
значения по одному на строку.
Канал целых с двумя слотами буфера получает
числа 10 и 20 подряд. После
этого напечатайте сумму двух принятых
элементов.