src/main/java/io/reactivex/parallel/ParallelFlowable.java
@CheckReturnValue
    @NonNull
    public final ParallelFlowable<T> runOn(@NonNull Scheduler scheduler, int prefetch) {
        ObjectHelper.requireNonNull(scheduler, "scheduler");
        ObjectHelper.verifyPositive(prefetch, "prefetch");
        return RxJavaPlugins.onAssembly(new ParallelRunOn<T>(this, scheduler, prefetch));
    }
@CheckReturnValue
    @NonNull
    public final ParallelFlowable<T> runOn(@NonNull Scheduler scheduler, int prefetch) {
        ObjectHelper.requireNonNull(scheduler, "scheduler");
        ObjectHelper.verifyPositive(prefetch, "prefetch");
        return RxJavaPlugins.onAssembly(new ParallelRunOn<T>(this, scheduler, prefetch));
    }
Specifies where each 'rail' will observe its incoming values with
possibly work-stealing and a given prefetch amount.
<p>
This operator uses the default prefetch size returned by {@code Flowable.bufferSize()}.
<p>
The operator will call {@code Scheduler.createWorker()} as many
times as this ParallelFlowable's parallelism level is.
<p>
No assumptions are made about the Scheduler's parallelism level,
if the Scheduler's parallelism level is lower than the ParallelFlowable's,
some rails may end up on the same thread/worker.
<p>
This operator doesn't require the Scheduler to be trampolining as it
does its own built-in trampolining logic.

@param scheduler the scheduler to use
that rail's worker has run out of work.
@param prefetch the number of values to request on each 'rail' from the source
@return the new ParallelFlowable instance