RxScala: Как сохранить поток, выполняющий Observable.interval, живым?

Я пытаюсь написать простую программу 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 умирает. Я заметил звонок waitFor(o) в RxScalaDemo, но я не могу понять, откуда это импортируется.

Как сохранить работоспособность этой программы для печати числовой последовательности?

2 ответа

Решение

Вы ничего не видите, потому что ваш main метод завершается сразу после подписки на Observable, На этом ваша программа готова.

Обычный трюк для таких тестовых программ - это чтение байта из stdin после подписки.

Вот один из способов заблокировать выход основного потока:

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 заблокировать основной поток и затем считать вниз защелку, когда вы закончите с тем, что вы делаете, освобождая тем самым основной поток

Другие вопросы по тегам