Modernizacja za pomocą Rxjava Schedulers.newThread () vs Schedulers.io ()


84

Jakie są korzyści z używania w Schedulers.newThread()porównaniu Schedulers.io()z Retrofitżądaniami sieciowymi. Widziałem wiele przykładów, które używają io(), ale chcę zrozumieć, dlaczego.

Przykładowa sytuacja:

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

vs

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

Jednym z powodów, które widziałem, jest -

newThread()tworzy nowy wątek dla każdej jednostki pracy. io()użyje puli wątków

Ale jaki jest wpływ tego argumentu na aplikację? A jakie są inne aspekty?

Odpowiedzi:


99

Masz rację, że korzyść z używania Schedulers.io()polega na tym, że używa puli wątków, a Schedulers.newThread()nie.

Głównym powodem, dla którego warto rozważyć użycie pul wątków, jest to, że obsługują one wiele wstępnie utworzonych wątków, które są bezczynne i czekają na pracę. Oznacza to, że kiedy masz pracę do wykonania, nie musisz przechodzić przez obciążenie związane z tworzeniem wątku. Po zakończeniu pracy ten wątek można również ponownie wykorzystać do przyszłej pracy zamiast ciągłego tworzenia i niszczenia wątków.

Tworzenie wątków może być kosztowne, więc minimalizacja liczby wątków tworzonych w locie jest ogólnie dobra.

Aby uzyskać więcej informacji na temat pul wątków, polecam:


4
Może warto dodać komentarz, że Scheduler.io () jest oparty na nieograniczonej puli wątków, co może nie być odpowiednie w niektórych przypadkach użycia. Zobacz stackoverflow.com/questions/31276164/…
Dave Moten

@DaveMoten Jakie przypadki użycia są nieodpowiednie dla puli wątków za pośrednictwem Schedulers.io?
IgorGanapolsky

3
Jeśli masz dużo pracy równoległej do zrobienia, Schedulers.io()możesz uderzyć w limity systemu operacyjnego i / o (na przykład maksymalna liczba otwartych plików, maksymalna liczba połączeń TCP, które ze względu na niezawodność mogą pozostać otwarte przez pewien czas nawet po ich usunięciu) . Każdy nowy wątek wymaga również minimalnej niebanalnej ilości pamięci RAM (> 512K, ale działa na 1M), więc może zabraknąć pamięci RAM.
Dave Moten

Czy te wątki mają tę samą pamięć? np. obiekt utworzony w jednym wątku io dostęp do innego wątku io.
Eido95

1
@ Eido95 mają ten sam stos, a nie ten sam stos. Jeśli chodzi o zmienne, tak, możesz udostępniać zmienne między wątkami (ze wszystkimi typowymi ostrzeżeniami dotyczącymi upewnienia się, że te zmienne są bezpieczne dla wątków).
Bryan Herbst
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.