【问题标题】:Kotlin Quasar topic and channel blocking issueKotlin Quasar 主题和频道阻塞问题
【发布时间】:2015-10-05 04:57:22
【问题描述】:

我在 Kotlin 中使用 Quasar 并开始使用主题和频道。我正在关注一些 Java 示例并写了一点 sn-p。不幸的是,我似乎无法让它工作。它只是阻塞主线程并等待。我不太确定 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()
    }

}

【问题讨论】:

  • do {} 虽然不是正确的流程,但我不确定“for (Integer m; (m = c.receive()) != null; 的最佳替代品是什么” ) {}"
  • 问题中编辑的目的是什么?它在解决问题吗?它是否显示了一些解决方案?不必维护历史记录,保持问题简洁,我们可以根据需要查看编辑历史记录,或者如果您认为某些答案或评论无效,您可以在底部添加快速编辑日志。

标签: kotlin quasar


【解决方案1】:

join 方法告诉当前 strand(即线程或纤程)阻塞,直到调用它的 strand 终止。在这种情况下,您等待光纤终止,但它几乎无法启动,因为您还没有发送任何东西。

要解决,请将纤程分配给某个本地 (val f = fiber { ... }),并仅在程序结束时加入。或者,不要将其分配给任何东西,也不要加入。

【讨论】:

  • 谢谢!我注意到它在没有睡眠的情况下表现得很有趣,所以我把它扔进了另一根纤维中并以这种方式进行了测试。这也导致我在 do while 循环中看到了一个错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-30
  • 1970-01-01
  • 2017-05-23
  • 2015-08-17
  • 2021-07-18
  • 2015-10-11
相关资源
最近更新 更多