RxScala: How to keep the thread doing Observable.i

2019-08-15 14:07发布

问题:

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?

回答1:

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.



回答2:

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