As discussed earlier, thread pools are a collection of threads. Depending on the policy of that thread pool, threads may be persisted and maintained so they can be reused. A queue of tasks is then executed by that thread pool.
Some thread pools hold a fixed number of threads (such as the computation() one we used earlier), while others dynamically create and destroy threads as needed. Typically in Java, you use an ExecutorService as your thread pool. However, RxJava implements its own concurrency abstraction called Scheduler. It define methods and rules that an actual concurrency provider such as an ExecutorService or actor system must obey. The construct flexibly makes RxJava non-opinionated on the source of concurrency.
Many of the default Scheduler implementations can be found in the Schedulers static factory class. For a given Observer...