使用ForkJoinPool.commonPool()代替RxJava的计算调度程序

时间:2018-03-29 23:01:50

标签: concurrency rx-java2 reactive-streams

我目前正在为个人项目实施一小部分RxJava2的API。我有一个基于监听器的API,我开始编写代码来包装我的监听器并实现Flowable.create()

public class EventBus {
    private final Flowable<Event> events;

    public EventBus(MyApi api) {
        this.events = Flowable.create(emitter -> {
            Callback listener = new Callback() {
                @Override
                public void onEvent(Event event) {
                    emitter.onNext(event);
                }
            };
            api.addListener(listener);
            // TODO api.removeListener(listener)
        }, BackpressureStrategy.BUFFER);
    }
}.

我运行了一个快速测试,它运行得很好,但我意识到它是单线程。没什么大不了的:除非指定Scheduler,否则RxJava的设计实际上是单线程的。

根据RxJava2的文档,我决定链接一个Flowable.subscribeOn()调用,我将使用Scheduler.computation()参数调用。

所以我继续实施Flowable.subscribeOn()Scheduler.computation(),这就是我试图解决的问题:我已经在各个地方看到了Java&#39 ; s ForkJoinPool.commonPool()建议运行计算任务,但RxJava2不使用它。我的主要问题是:

  • 这是否适合我的基本反应实施?
  • 为什么RxJava2选择实现自己的池而不是使用这个?
  • 我应该注意这种方法有什么问题,让我的生活更轻松吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

  

这是否适合我的基本反应性实施?

将补丁写入传统的回调api有点常见,假设还没有写过。

  

为什么RxJava2选择实现自己的池而不是使用这个?

RxJava始终针对Java 6及更高版本而ForkJoinPool是Java 7.请注意,commonPool有时会在调用者线程上执行工作,并且不会异步。由于同一个池死锁,我们在CI服务器上挂了很多单元测试。

  

实现一小部分RxJava2的API   我应该注意这种方法有什么问题,让我的生活更轻松吗?

你是什么意思?您是尝试重新实现RxJava 2,库,还是在您的代码中使用应用现有运算符?

如果是后者,除了commonPool的警告之外,它取决于你想要与之交互的内容。