2015-04-03 2 views
1

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

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, но я не могу понять, откуда он импортируется.

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

ответ

3

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

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

4

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

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

Смежные вопросы