当javarx2 Flowable订阅Scheduler.computation时,如果任务超过线程池大小会发生什么

时间:2018-06-26 08:16:58

标签: java multithreading threadpool rx-java2

当javarx2 Flowable订阅Schedulers.computation时,如果任务超过线程池大小会发生什么?

我读到Scheduler,默认线程数是可用CPU的数量。 但是谁负责所有计划外的任务呢?

我如何了解其行为?

    Flowable
            .fromArray(accountsMap.keySet().toArray())
            .flatMap(key ->

                Flowable
                    .just(key)
                    .subscribeOn(Schedulers.computation())
                    .doOnNext(sameKey -> {

                        //do my stuff

                    })
            )
            .blockingSubscribe(a ->
                {
                    logger.info("blockingSubscribe received: " + a);
                }
            );

答案的重要部分是我在哪里可以阅读此信息? 因为我发现很难达到 official class description

1 个答案:

答案 0 :(得分:0)

默认调度程序不限制调度的任务数量,因为它们使用Executors.newScheduledThreadPoolExecutor()调用来创建工作程序。工作多于核心不是问题。

但是,如果您使用包装在调度程序中的自定义Executor并且它们拒绝工作,则该错误将传播到全局错误处理程序。不幸的是,对于RxJava来说,这是无法恢复的情况,因为它可能由于违反协议(并发)而无法向观察者发出错误信号。 (即,通常也应该安排错误信号,这可能是不可能的,因为也可以拒绝该错误信号,并且另一端可能仍在同时执行。)