RxScala:如何使Observable.interval的线程保持活动状态?

时间:2015-04-03 21:21:02

标签: multithreading scala rx-java rx-scala

我正在尝试编写一个简单的RxScala程序:

import rx.lang.scala.Observable

import scala.concurrent.duration.DurationInt
import scala.language.{implicitConversions, postfixOps}

object Main {
  def main(args: Array[String]): Unit = {
    val o = Observable.interval(1 second)
    o.subscribe(println(_))
  }
}

当我运行此程序时,我看不到任何打印出来的内容。我怀疑这是因为产生Observable.interval中的数字的线程死了。我注意到RxScalaDemo中有waitFor(o)的来电,但我无法确定从哪里导入。

如何让这个程序继续运行以打印数字序列?

2 个答案:

答案 0 :(得分:4)

以下是阻止主线程退出的一种方法:

val o = Observable.interval(1 second)
val latch = new CountDownLatch(1)
o.subscribe(i => {
  print(i)
  if (i >= 5) latch.countDown()

})
latch.await()

这是一个相当常见的模式,使用CountDownLatch.await来阻止主线程然后在你完成你正在做的事情时countDown锁存,从而释放主线程

答案 1 :(得分:3)

由于main方法在您订阅Observable后立即退出,因此您没有看到任何内容。那时,你的程序就完成了。

这样的测试程序的一个常见技巧是在您订阅后从stdin读取一个字节。