如何在单独的线程中运行`Observable`?

时间:2014-06-04 21:50:47

标签: multithreading scala reactive-programming rx-java

我在Scala项目中使用RxJava并说我有这个简单的Observable

Observable[String](observer => while (true) observer onNext "hi")
  .subscribe(v => println(v))

println("hello")

我永远不会去"你好"消息,因为while阻止了一个线程。如何在单独的线程中运行Observable以避免阻塞?

==================================

我在想observeOn可以提供帮助,但事实并非如此。运行这个:

val s = rx.lang.scala.schedulers.NewThreadScheduler.apply

Observable[String](observer => while (true) observer onNext "hi")
  .observeOn(s).subscribe(v => println(v))

println("hello")

...仍然不打印"你好"。我想添加observeOn会使OnNext在一个单独的线程中调用,而不是while块本身?

==================================

我当然可以将while包裹在Future

Observable[String](observer => Future { while (true) observer onNext "hi" })
  .subscribe(v => println(v))

println("test") // "test" gets printed

但也许有更多rx-idiomatic方法可以做到这一点?

1 个答案:

答案 0 :(得分:3)

您需要使用subscribeOn。如,

Observable[String](observer => while (true) observer onNext "hi").subscribeOn(s)
  .subscribe(v => println(v))

subscribeOn会调用subscribe中的Scheduler函数,而observeOn会将邮件发送到Scheduler