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:
- ¿Cómo puedo cambiar la versión del comstackdor de Kotlin en IntelliJ?
- El ejemplo de Kotlin Quasar no funciona
- Función en línea del error del comstackdor de Kotlin, no estoy seguro de qué está pasando
- Advertencia y abandono de Kotlin / Quasar Fiber
- Kotlin Capsule Gradle Error
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.