Bieszczady mountains Simple, effective and safe concurrency was one of the design principles of RxJava. Yet, ironically, it's probably one of the most misunderstood aspects of this library. Let's take a simple example: imagine we have a bunch of UUID s and for each one of them we must perform a set of tasks. The first problem is to perform I/O intensive operation per each UUID , for example loading an object from a database: Flowable<UUID> ids = Flowable .fromCallable(UUID::randomUUID) .repeat() .take(100); ids.subscribe(id -> slowLoadBy(id)); First I'm generating 100 random UUID s just for the sake of testing. Then for each UUID I'd like to load a record using the following method: Person slowLoadBy(UUID id) { //... } The implementation of slowLoadBy() is irrelevant, just keep in mind it's slow and blocking. Using subscribe() to invoke slowLoadBy() has many disadvantages: subscribe() is single-threaded by desi