目前使用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
RxIoScheduler-1
,不是吗?RxIoScheduler-1
这样的旧活动线程完成其工作时,它会被清除? 我很快就会担心,由于开放线程的数量,应用程序会在执行某项繁重任务时获得OOM或以某种方式命中OOM。
答案 0 :(得分:2)
io()调度程序托管一个单线程ScheduledExecutorServices池,当您使用observeOn,subscribeOn和其他带有Scheduler的运算符时,这些服务器将作为worker分发。在相关序列终止或取消订阅之前,支持该工作者的线程仍处于活动状态。
如果您有多个活动序列,则会获得多个IO Scheduler线程。完成后,它们会回到池中,准备好被另一个序列重用。但是,如果没有重复使用,还会有一个默认的1分钟超时会停止线程。如果操作员然后再次从IO调度程序中请求工作程序,则会启动一个新的线程,该线程会在其名称中获取一个新值,因此如果应用程序运行的时间足够长,您可能会获得19,2002等。
如果您的序列没有终止并且只是不断堆积,最终耗尽操作系统线程,您可能会获得OOM。