1

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?

Binil Thomas
  • 13,699
  • 10
  • 57
  • 70

2 Answers2

5

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

Biju Kunjummen
  • 49,138
  • 14
  • 112
  • 125
3

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.

Rob Worsnop
  • 1,164
  • 1
  • 9
  • 22