RxScala: How to keep the thread doing Observable.i

2019-08-15 13:17发布

I am trying to write a simple RxScala program:

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

When I run this program, I do not see anything printed out. I suspect that this is because that thread producing the numbers in Observable.interval dies. I noticed a call to waitFor(o) in the RxScalaDemo, but I can't figure out where that is imported from.

How do I keep this program running for ever printing the number sequence?

2条回答
beautiful°
2楼-- · 2019-08-15 13:59

You're not seeing anything because your main method exits immediately after you subscribe to the Observable. At that point, your program is done.

A common trick for test programs like this is to read a byte from stdin once you've subscribed.

查看更多
萌系小妹纸
3楼-- · 2019-08-15 14:14

Here is one way to block the main thread from exiting:

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

})
latch.await()

This is a fairly common pattern, use CountDownLatch.await to block the main thread and then countDown the latch when you are done with what you are doing, thus releasing the main thread

查看更多
登录 后发表回答