【问题标题】:In RxJava, is emitting event by observable multi-threaded?在 RxJava 中,是通过可观察的多线程发出事件吗?
【发布时间】:2020-06-09 22:19:48
【问题描述】:

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

Observable observable = Observable.just("Hello");

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

【问题讨论】:

  • 回答您的其他问题:线程数没有限制,除了硬件(即没有足够的内存来创建线程)。为了避免这种情况,大多数框架都使用线程池,而不是为每个任务创建一个线程。
  • stackoverflow.com/questions/43436640/… 关于 RxJava 中的并发

标签: java rx-java


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 如果RxJava一般不使用多线程,那么如何实现并发和异步呢?我曾经认为并发需要多线程。
  • @sea 需要 RxJava 并发的人通常 使用多线程,使用Schedulers。可以通过其他方式获得并发,例如通过非阻塞 I/O,这也可以与 RxJava 一起使用。
  • 只是为了完成:NIO 在后台使用线程池来完成处理程序。不知道有没有epoll、io_uring的实现,有没有使用线程池。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-04
  • 2017-02-17
相关资源
最近更新 更多