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