2016-12-28 5 views
1

В настоящее время используется rxjava ver 1.2.4 и rxandroid 1.2.1. У меня есть вопрос относительно .subscribeOn(Schedulers.io()), который я прочитал из javadoc, который есть:Число потоков RxIoScheduler продолжает расти

«Реализация поддерживается потоком-потоком Исполнителя, который будет расти по мере необходимости».

Как видно из журнала, я понимаю количество потоков продолжают расти каждый раз я сделать некоторые задачи:

12-28 11:17:03.879 D/HistoryDatabaseHelper: RxIoScheduler-22 
12-28 11:17:03.918 D/HistoryDatabaseHelper: RxIoScheduler-19 
12-28 11:17:03.918 D/HistoryDatabaseHelper: RxIoScheduler-18 
  1. Когда приложение становится неактивным, не предположить, нет какой-либо очереди выполнения задачи. Итак, следующая задача должна использовать обратно RxIoScheduler-1, нет?
  2. Когда все потоки очистятся?
  3. Или это просто имя потока, которое меня путает, когда старая активная нить вроде RxIoScheduler-1 очищается, когда она выполняет свою работу?

Я беспокоюсь, скоро приложение получит OOM или каким-то образом ударит OOM при выполнении тяжелой задачи из-за количества открываемых потоков.

ответ

2

Планировщик io() содержит пул однопоточных служб ScheduledExecutorServices, которые раздаются как рабочие, когда вы используете функции observOn, subscribeOn и других операторов, которые принимают планировщик. До тех пор, пока соответствующая последовательность не завершится или не будет отписана, эта нить, поддерживающая рабочий, будет жива.

Если у вас несколько активных последовательностей, вы получаете несколько потоков IO Scheduler. После этого они возвращаются в бассейн, готовый к повторному использованию другой последовательностью. Однако есть также тайм-аут по умолчанию 1 минута, который останавливает потоки, если они не используются повторно. Если оператор затем требует рабочего снова из Планировщика IO, запускается новый поток, который получает новое значение в своем имени, поэтому вы можете получить 19, 2002 и т. Д., Если приложение работает достаточно долго.

Вы можете получить OOM, если ваши последовательности не прекращаются и просто продолжаются нагромождение, в конечном итоге заканчиваются потоки операционной системы.

+0

Спасибо за объяснение! Я думаю, что отказаться от подписки на все подписки, играющие главную роль, чтобы освободить эти потоки, я прав? Я знал, что нормальный сетевой вызов и транзакция db достаточно хороши для использования io(), но можете ли вы привести пример, когда вычисление() пригодится? Является ли декодирование изображений рассмотрением вычислительной задачи? – Bryanleesh