Модернізація за допомогою Rxjava Schedulers.newThread () проти Schedulers.io ()


84

Які переваги для використання Schedulers.newThread()проти 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 вони діляться однією купою, а не одним стеком. Що стосується змінних, так, ви можете ділитися змінними між потоками (з усіма типовими попередженнями про те, щоб ці змінні були безпечними для потоків).
Брайан Гербст,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.