Tema de Kotlin Quasar y problema de locking de canales

Estaba jugando con Quasar en Kotlin y comencé a trabajar con temas y canales. Estaba siguiendo algunos ejemplos de Java y escribí un pequeño fragment. Desafortunadamente, parece que no puedo hacer que funcione. Solo bloquea el hilo principal y espera. No estoy muy seguro de qué es lo que está haciendo y me pregunto si ese podría ser el problema.

public fun channelsDemo() { val x: Val<Int> = Val() val t: Topic<Int> = Topic() fiber { val c: Channel<Int> = t.subscribe(Channels.newChannel(0)) do { val m = c.receive() System.out.println("Channel => " + (m + x.get())) } while (m != null) }.join() x.set(13) t.send(5) t.close() } 

editar:

 public fun channelsDemo() { val x: Val<Int> = Val() val t: Topic<Int> = Topic() fiber { val c: Channel<Int> = t.subscribe(Channels.newChannel(0)) do { val m = c.receive() System.out.println("Channel => " + (m + x.get())) } while (m != 40) } fiber { Strand.sleep(20000) x.set(13) t.send(5) t.send(21) t.send(40) t.close() } } 

El método de join le dice al filamento actual (es decir, hilo o fibra) que bloquee hasta que el hilo al que se llama termine. En este caso, esperas a que la fibra termine, pero apenas puede comenzar porque todavía no la has enviado.

Para resolverlo, asigne la fibra a algún local ( val f = fiber { ... } ), y únase solo al final del progtwig. Alternativamente, no lo asigne a nada y nunca se una.