Операторы смены потока выполнения (треда) subscribeOn() и observeOn() в RxJava принимают объект класса Scheduler.

Scheduler можно создать с помощью статических фабричных методов класса Schedulers.
Самые часто используемые методы: Schedulers.io() и Schedulers.computation().

Schedulers.io() возвращает Scheduler, который предназначен для выполнения блокирующих IO операций. IO Scheduler основан на неограниченном пуле потоков. Для выполнения задачи из пула выбирается поток и затем возвращается в пул после завершения работы. Если в пуле нет свободных потоков, то создается новый поток и добавляется в пул.
Новые потоки будут оставаться в пуле на протяжении всей жизни приложения. Неосторожное использование IO Scheduler может привести к крэшу приложения с OutOfMemoryError.

Schedulers.computation() возвращает Scheduler, предназначенный для выполнения вычислительной работы. Не рекомендуется использовать этот Scheduler для блокирующих операций. Computation Scheduler основан на пуле потоков фиксированного размера. По умолчанию размер пула равен количеству процессоров, которое получается методом Runtime.availableProcessors(). Если на выполнение приходит задача, когда все потоки пула заняты, задача добавляется в очередь и будет выполнены первым освободившимся потоком.

Подробнее о различных реализациях Scheduler.