Модернизация с помощью Rxjava Schedulers.newThread () против Schedulers.io ()

84

Каковы преимущества использования Schedulers.newThread()vs Schedulers.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()будет использовать пул потоков

Но как этот аргумент повлиял на приложение? А какие еще есть аспекты?

Микелис Канепс
источник

Ответы:

99

Вы правы в том, что преимущество использования Schedulers.io()заключается в том, что он использует пул потоков, тогда как Schedulers.newThread()нет.

Основная причина, по которой вам следует подумать об использовании пулов потоков, заключается в том, что они поддерживают ряд предварительно созданных потоков, которые простаивают и ожидают работы. Это означает, что когда у вас есть работа, вам не нужно тратить время на создание потока. После того, как ваша работа будет завершена, этот поток также можно будет повторно использовать для будущей работы вместо постоянного создания и уничтожения потоков.

Создание потоков может быть дорогостоящим, поэтому минимизировать количество потоков, которые вы создаете на лету, как правило, хорошо.

Для получения дополнительной информации о пулах потоков я рекомендую:

Брайан Хербст
источник
4
Возможно, стоит добавить комментарий о том, что Scheduler.io () основан на неограниченном пуле потоков, что может не подходить для некоторых случаев использования. См. Stackoverflow.com/questions/31276164/…
Дэйв Мотен
@DaveMoten Какие варианты использования не подходят для пула потоков через Schedulers.io?
Игорь Ганапольский
3
Если у вас много одновременной работы, Schedulers.io()вы можете столкнуться с ограничениями ввода-вывода ОС (например, максимальное количество открытых файлов, максимальное количество TCP-соединений, которые в целях надежности могут оставаться открытыми в течение определенного периода времени даже после удаления) . Каждый новый поток также требует минимального нетривиального объема ОЗУ (> 512 КБ, но работает с 1 МБ), чтобы у вас могло закончиться ОЗУ.
Дэйв Мотен
Эти потоки используют одну и ту же память? например, объект, созданный в одном потоке io и доступный в другом потоке io.
Eido95
1
@ Eido95 они используют одну и ту же кучу, а не один стек. Что касается переменных, да, вы можете совместно использовать переменные между потоками (со всеми типичными предупреждениями о том, что эти переменные являются потокобезопасными).
Брайан Хербст