使用Rxjava Schedulers.newThread()与Schedulers.io()进行改造


84

什么是使用的好处Schedulers.newThread()VSSchedulers.io()Retrofit网络请求。我已经看到了许多使用的示例io(),但是我想理解为什么。

情况示例:

observable.onErrorResumeNext(refreshTokenAndRetry(observable))
    .subscribeOn(Schedulers.newThread())
    .observeOn(AndroidSchedulers.mainThread())...

observable.onErrorResumeNext(refreshTokenAndRetry(observable))
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())...

我见过的原因之一是-

newThread()为每个工作单元创建一个新线程。io()将使用线程池

但是,这种说法对应用程序有什么影响?还有其他哪些方面?

Answers:


99

没错,使用的好处Schedulers.io()在于使用了线程池,而Schedulers.newThread()没有使用线程池。

您应该考虑使用线程池的主要原因是它们维护了许多预先创建的线程,这些线程处于空闲状态并正在等待工作。这意味着当您有工作要做时,您无需经历创建线程的开销。工作完成后,也可以将该线程重新用于以后的工作,而不必不断创建和销毁线程。

创建线程可能会很昂贵,因此,最大程度地减少动态创建的线程数量通常是好的。

有关线程池的更多信息,我建议:


4
可能值得添加有关Scheduler.io()基于无限制线程池的注释,这可能不适用于某些用例。见stackoverflow.com/questions/31276164/...
戴夫MOTEN

@DaveMoten什么用例不适合通过线程池Schedulers.io
IgorGanapolsky '16

3
如果您有大量的并发工作,Schedulers.io()那么您可能会遇到OS I / O限制(例如,打开文件的最大数量,tcp连接的最大数量(出于可靠性目的,即使被处置后,tcp连接的最大数量也可能保持打开状态)) 。每个新线程还需要最少少量的RAM(> 512K,但工作在1M上),因此您可能会用完RAM。
Dave Moten

这些线程共享相同的内存吗?例如,在一个io线程中创建并在另一个io线程中访问的对象。
Eido95 '16

1
@ Eido95他们共享相同的堆,而不是相同的堆栈。就变量而言,是的,您可以在线程之间共享变量(有关确保这些变量是线程安全的所有典型警告)。
布莱恩·赫伯斯特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.