在 RxJava 中,是否通过可观察的多线程发出事件?

In RxJava, is emitting event by observable multi-threaded?

RxJava 是否在幕后是多线程的,比如说如果下面的一个 observable 发出了事件 hello,它是通过创建一个新线程来实现的吗?

Observable 可观察 = Observable.just("Hello");

如果是多线程的话,JVM有没有限制它可以创建的新线程的最大数量,因此Observable的使用也可能受到限制?

默认情况下,RxJava 中没有任何东西是多线程的。然而,通过使用 Schedulers 可以很容易地引入多线程。例如,如果您这样做:

Observable.just("Hello")
  .subscribeOn(Schedulers.computation())
  .subscribe(i -> System.out.println(i +  " " + Thread.currentThread().getName());

您会看到 println 调用发生在计算调度程序提供的线程上。如果没有 subscribeOn 调用,您会在主线程中看到它 运行。

RxJava 提供了多种类型的调度器,每一种都有不同的属性。有 I/O 调度程序,它将通过为每个请求创建一个新线程开始,但是一旦它们空闲就会重新使用以前创建的线程。有一个计算调度器(我在上面使用过),它使用固定大小的线程池等运行。如果提供的 none 满足您的需求,您也可以编写自己的。

我强烈建议阅读有关该主题的文档,因为 RxJava 的并发方法与您可能习惯的有所不同。