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 the threads from that pool.
Some thread pools hold a fixed number of threads (such as a thread created by the computation() method we used earlier), while others dynamically create and destroy threads as needed.
Typically, in Java, you use an ExecutorService as a thread pool. However, RxJava implements its own concurrency abstraction called Scheduler. This defines methods and rules that an actual concurrency provider such as an ExecutorService or actor system must obey. The construct flexibly renders RxJava non-opinionated regarding the source of concurrency.
Many of the default Scheduler implementations can be found in the Schedulers static factory...