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

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

Пример ситуации:

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

vs

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

Одна из причин, которые я видел -

newThread() создает новый поток для каждой единицы работы. io() будет использовать пул потоков

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


person Mikelis Kaneps    schedule 29.10.2015    source источник


Ответы (1)


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

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

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

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

person Bryan Herbst    schedule 29.10.2015
comment
Возможно, стоит добавить комментарий о том, что Scheduler.io () основан на неограниченном пуле потоков, что может не подходить для некоторых случаев использования. См. stackoverflow.com/questions/31276164/ - person Dave Moten; 30.10.2015
comment
@DaveMoten Какие варианты использования не подходят для пула потоков через Schedulers.io? - person IgorGanapolsky; 19.01.2016
comment
Если у вас много одновременной работы, связанной с Schedulers.io(), вы можете столкнуться с ограничениями ввода-вывода ОС (например, максимальное количество открытых файлов, максимальное количество TCP-соединений, которые в целях надежности могут оставаться открытыми в течение определенного периода времени даже после удаления ). Каждый новый поток также требует минимального нетривиального объема ОЗУ (›512 КБ, но работает с 1 МБ), чтобы у вас могло закончиться ОЗУ. - person Dave Moten; 20.01.2016
comment
Эти потоки используют одну и ту же память? например объект, созданный в одном потоке io и доступный в другом потоке io. - person Eido95; 21.11.2016
comment
@ Eido95 они используют одну и ту же кучу, а не один стек. Что касается переменных, да, вы можете обмениваться переменными между потоками (со всеми типичными предупреждениями о том, что эти переменные являются потокобезопасными). - person Bryan Herbst; 21.11.2016
comment
Я прочитал ваш ответ около двух недель назад и реализовал все свои Observables с помощью Schedulers.io (). Все работало нормально, но приложение работало слишком медленно. После замены всех Schedulers.io () на Schedulders.newThread () мои приложения работают в пять раз быстрее. Я настоятельно рекомендую использовать новый поток для сетевых подключений. - person Mehdi Pourfar; 04.04.2017