1. 程式人生 > >Retrofit with Rxjava : Schedulers.newThread() vs Schedulers.io()

Retrofit with Rxjava : Schedulers.newThread() vs Schedulers.io()

翻譯自 Retrofit with Rxjava Schedulers.newThread() vs Schedulers.io() stackoverflow討論版

提問:
在使用Retrofit網路請求時使用 Schedulers.newThread() 和 Schedulers.io() 各有什麼好處?我在許多的專案中見到的是使用 Schedulers.io() ,我想知道為什麼呢?
像是這樣的例子:

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

VS

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

似乎有看過這樣的一個原因:
newThread() 會為每個例項建立一個新執行緒,而 io() 使用的是執行緒池來管理
我想知道這個原因具體對我們的應用程式有怎樣的影響,其他方面還有什麼原因呢?

回答:
這個原因是正確的,確實 Schedulers.io() 使用的好處在於它是使用執行緒池,而Schedulers.newThread()不是。
你應該考慮使用執行緒池的主要原因,是它們維護了許多空閒且等待工作的預建立線​​程。這意味著當你完成工作時,你不需要經歷建立執行緒的開銷。完成工作後,該執行緒也可以重新用於之後的工作,而不是不斷建立和銷燬執行緒。

執行緒建立起來可能很昂貴,因此最大限度地減少動態建立的執行緒數會更好一些。

有關執行緒池的更多資訊,我建議:

另外,如果你有很多併發工作要使用

Schedulers.io() ,那麼你可能會遇到OS i / o限制(比如說,開啟檔案的最大數量,tcp連線的最大數量,為了保證可靠性,即使在處置後也可能保持開啟一段時間) 。每個新執行緒還需要一個最小的但不可忽視的RAM(> 512K,但工作在1M),因此你可能會用完RAM。