RxIoScheduler线程数不断增加

时间:2016-12-28 03:45:09

标签: java android asynchronous rx-java rx-android

目前使用rxjava ver 1.2.4和rxandroid 1.2.1。我在javadoc上读到.subscribeOn(Schedulers.io())的问题是:

"实现由Executor线程池支持,该线程池将根据需要增长。"

从日志中可以看出,每当我执行某项任务时,线程数就会不断增加:

12-28 11:17:03.879 D/HistoryDatabaseHelper: RxIoScheduler-22
12-28 11:17:03.918 D/HistoryDatabaseHelper: RxIoScheduler-19
12-28 11:17:03.918 D/HistoryDatabaseHelper: RxIoScheduler-18
  1. 当应用程序变为空闲时,假设没有任何待处理任务正在运行。那么下一个任务应该使用回RxIoScheduler-1,不是吗?
  2. 所有线程何时清理?
  3. 或者它只是让我感到困惑的线程名称,当RxIoScheduler-1这样的旧活动线程完成其工作时,它会被清除?
  4. 我很快就会担心,由于开放线程的数量,应用程序会在执行某项繁重任务时获得OOM或以某种方式命中OOM。

1 个答案:

答案 0 :(得分:2)

io()调度程序托管一个单线程ScheduledExecutorServices池,当您使用observeOn,subscribeOn和其他带有Scheduler的运算符时,这些服务器将作为worker分发。在相关序列终止或取消订阅之前,支持该工作者的线程仍处于活动状态。

如果您有多个活动序列,则会获得多个IO Scheduler线程。完成后,它们会回到池中,准备好被另一个序列重用。但是,如果没有重复使用,还会有一个默认的1分钟超时会停止线程。如果操作员然后再次从IO调度程序中请求工作程序,则会启动一个新的线程,该线程会在其名称中获取一个新值,因此如果应用程序运行的时间足够长,您可能会获得19,2002等。

如果您的序列没有终止并且只是不断堆积,最终耗尽操作系统线程,您可能会获得OOM。