Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗ktSpChBf 175 of 299 menu
◀ ▶

Буфер канала в 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 подряд. После этого напечатайте сумму двух принятых элементов.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить