Kotlin Quasar 主题和频道阻塞问题
Kotlin Quasar topic and channel blocking issue
我在 Kotlin 中使用 Quasar 并开始处理主题和频道。我正在关注一些 Java 示例并写了一个小片段。不幸的是,我似乎无法让它工作。它只是阻塞主线程并等待。我不太确定 join 在做什么,想知道这是否是问题所在?
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()
}
编辑:
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()
}
}
join
方法告诉当前 strand(即线程或纤程)阻塞,直到调用它的链终止。在这种情况下,您等待光纤终止,但它几乎无法启动,因为您还没有向它发送任何东西。
要解决,将光纤分配给某个本地(val f = fiber { ... }
),并且只在程序结束时加入它。或者,不要将它分配给任何东西并且永远不要加入。
我在 Kotlin 中使用 Quasar 并开始处理主题和频道。我正在关注一些 Java 示例并写了一个小片段。不幸的是,我似乎无法让它工作。它只是阻塞主线程并等待。我不太确定 join 在做什么,想知道这是否是问题所在?
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()
}
编辑:
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()
}
}
join
方法告诉当前 strand(即线程或纤程)阻塞,直到调用它的链终止。在这种情况下,您等待光纤终止,但它几乎无法启动,因为您还没有向它发送任何东西。
要解决,将光纤分配给某个本地(val f = fiber { ... }
),并且只在程序结束时加入它。或者,不要将它分配给任何东西并且永远不要加入。