There are several ways to look at this: RxJava ~ Coroutines - Context. In order to resume a coroutine, one needs an execution context which is equivalent to Schedulers.trampoline(). Otherwise, CommonPool == Schedulers.from(ForkJoinPool.commonPool()). One of the ideas of Rx in general was the separation of when and where a flow executes, the latter being the Scheduler abstraction. This helps most operators not to worry about asynchronous boundaries. With coroutines, the when and where are now coupled together again whether you need that or not. I have written a couple of [interop](
https://github.com/akarnokd/akarnokd-misc-kotlin/blob/master/src/main/kotlin/hu/akarnokd/kotlin/RxJavaCoroutineInterop.kt#L30) operators to translate between the two worlds.