Buffered channels
Up until now, all the channels that we used had a capacity of exactly one element.
This means that if you write to this channel but no one reads from it, the sender will be suspended:
val channel = Channel<Int>() val j = launch { for (i in 1..10) { channel.send(i) println("Sent $i")
} } j.join()
This code doesn't print anything because the coroutine is waiting for someone to read from the channel.
To avoid that, we can create a buffered channel:
val channel = Channel<Int>(5)
Now suspension will occur only when the channel capacity is reached.
It prints:
Sent 1 Sent 2 Sent 3 Sent 4 Sent 5
Since produce()
and actor()
are also backed up by a channel, we can make it buffered too:
val actor = actor<Int>(capacity = 5) { ... } val producer = produce<Int>(capacity = 10) { ... }