Nachrüstung mit Rxjava Schedulers.newThread () vs Schedulers.io ()

84

Was sind die Vorteile zu nutzen Schedulers.newThread()vs Schedulers.io()in RetrofitNetzwerk - Anfrage. Ich habe viele Beispiele gesehen, die verwenden io(), aber ich möchte verstehen, warum.

Beispielsituation:

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

vs.

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

Einer der Gründe, die ich gesehen habe, ist -

newThread()erstellt für jede Arbeitseinheit einen neuen Thread. io()wird einen Thread-Pool verwenden

Aber welchen Einfluss hat dieses Argument auf die App? Und welche anderen Aspekte gibt es?

Mikelis Kaneps
quelle

Antworten:

98

Sie haben Recht, dass der Vorteil der Verwendung Schedulers.io()in der Tatsache liegt, dass ein Thread-Pool verwendet wird, während Schedulers.newThread()dies nicht der Fall ist.

Der Hauptgrund, warum Sie die Verwendung von Thread-Pools in Betracht ziehen sollten, besteht darin, dass sie eine Reihe von vorab erstellten Threads verwalten, die inaktiv sind und auf Arbeit warten. Dies bedeutet, dass Sie, wenn Sie Arbeit erledigen müssen, nicht den Aufwand für das Erstellen eines Threads auf sich nehmen müssen. Sobald Ihre Arbeit erledigt ist, kann dieser Thread auch für zukünftige Arbeiten wiederverwendet werden, anstatt ständig Threads zu erstellen und zu zerstören.

Das Erstellen von Threads kann teuer sein. Daher ist es im Allgemeinen gut, die Anzahl der Threads zu minimieren, die Sie im laufenden Betrieb erstellen.

Für weitere Informationen zu Thread-Pools empfehle ich:

Bryan Herbst
quelle
4
Es könnte sich lohnen, einen Kommentar zu Scheduler.io () hinzuzufügen, der auf einem unbegrenzten Thread-Pool basiert, der für einige Anwendungsfälle möglicherweise nicht geeignet ist. Siehe stackoverflow.com/questions/31276164/…
Dave Moten
@ DaveMoten Welche Anwendungsfälle sind für den Thread-Pool über ungeeignet Schedulers.io?
IgorGanapolsky
3
Wenn Sie viel gleichzeitig arbeiten müssen, können Schedulers.io()Sie auf die E / A-Grenzwerte des Betriebssystems stoßen (z. B. maximale Anzahl geöffneter Dateien, maximale Anzahl von TCP-Verbindungen, die aus Gründen der Zuverlässigkeit auch nach der Entsorgung für einen bestimmten Zeitraum offen bleiben können). . Jeder neue Thread benötigt außerdem eine nicht triviale Mindestmenge an RAM (> 512 KB, arbeitet jedoch mit 1 MB), sodass Ihnen möglicherweise der Arbeitsspeicher ausgeht.
Dave Moten
Teilen sich diese Threads den gleichen Speicher? zB Objekt, das in einem Io-Thread erstellt wurde und auf das in einem anderen Io-Thread zugegriffen wird.
Eido95
1
@ Eido95 sie teilen sich den gleichen Haufen, nicht den gleichen Stapel. Was Variablen betrifft, können Sie Variablen zwischen Threads gemeinsam nutzen (mit allen typischen Warnungen, um sicherzustellen, dass diese Variablen threadsicher sind).
Bryan Herbst