2015-10-05 32 views
1

我在Kotlin玩Quasar并开始使用话题和频道。我正在关注一些Java示例并撰写了一小段代码。不幸的是,我似乎无法得到它的工作。它只是阻止主线程并等待。我不太确定联合会在做什么,并想知道这是否会成为问题?Kotlin Quasar话题和频道阻塞问题

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() 
    } 

} 
+0

虽然这不是正确的流程,但我不确定什么是最佳替代方法“for(Integer m;(m = c.receive())!= null;){}” –

+0

问题中编辑的目的是什么?它是否解决了这个问题?它显示了一些解决方案?历史并没有维持,保持问题简洁,我们可以查看编辑历史,如果我们愿意,也可以在底部,如果你觉得某些无效回答或评论添加快速编辑日志。 –

回答

2

join方法告诉电流(即线或纤维),以阻止,直到上终止它被称为链。在这种情况下,您需要等待光纤终止,但由于您尚未发送任何光纤,所以无法启动。

为了解决,分配光纤到一些地方(val f = fiber { ... }),并且只在程序的结尾加入。或者,不要将它分配给任何东西,也不要加入。

+0

谢谢!我注意到它在没有睡眠的情况下表现得很滑稽,所以我把它扔到另一根光纤中并且以这种方式进行了测试。这也导致我在while while循环中看到一个错误。 –