One of the most useful ways to work with channels is the select {} clause we saw in Chapter 8, Threads and Coroutines, in the Producers section.
But select is inherently biased. If two events happen at the same time, it will select the first clause.
In the following example, we'll have a producer that sends five values with a very short delay:
fun producer(name: String, repeats: Int) = produce {
repeat(repeats) {
delay(1)
send(name)
}
}
We'll create three such producers and see the results:
val repeats = 10_000
val p1 = producer("A", repeats)
val p2 = producer("B", repeats)
val p3 = producer("C", repeats)
val results = ConcurrentHashMap<String, Int>()
repeat(repeats) {
val result = select<String> {
p1.onReceive { it }
p2.onReceive { it }
p3.onReceive { it }
}
results...