2016-12-28 240 views
1

目前使用rxjava ver 1.2.4和rxandroid 1.2.1。我有一个关于.subscribeOn(Schedulers.io())的问题,我从javadoc读取的是:RxIoScheduler线程数不断增加

“该实现由一个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这样的旧活动线程在完成其工作时被清除?

我很担心,由于打开线程的数量,执行一些繁重任务时,应用程序将获得OOM或以某种方式击中OOM。

回答

2

io()调度程序包含一个单线程ScheduledExecutorServices池,当您使用observeOn,subscribeOn和其他采用调度程序的操作符时,它们将作为工作人员分发。在关联序列终止或取消订阅之前,支持该工作者的线程仍然存在。

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

如果你的序列没有终止,只是不断堆积,最终用完操作系统线程,你可能会得到OOM。

+0

感谢您的解释!我想取消订阅所有发布主要角色的订阅以发布这些主题,我是对的吗?我知道正常的网络调用和db事务足以使用io(),但是您可以举一些comput()方法派生的例子吗?解码图像是否考虑计算任务? – Bryanleesh