Concurrency 使用ForkJoinPool.commonPool()代替RxJava';s计算调度器

Concurrency 使用ForkJoinPool.commonPool()代替RxJava';s计算调度器,concurrency,rx-java2,reactive-streams,Concurrency,Rx Java2,Reactive Streams,我目前正在为一个个人项目实现RxJava2 API的一小部分。我有一个基于侦听器的API,我开始编写代码来包装我的侦听器,并实现Flowable.create(): 公共类事件总线{ 私人最终流动事件; 公共事件总线(MyApi){ this.events=Flowable.create(发射器->{ 回调侦听器=新回调(){ @凌驾 公共无效事件(事件){ emitter.onNext(事件); } }; addListener(监听器); //TODO api.RemovelListener

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

公共类事件总线{
私人最终流动事件;
公共事件总线(MyApi){
this.events=Flowable.create(发射器->{
回调侦听器=新回调(){
@凌驾
公共无效事件(事件){
emitter.onNext(事件);
}
};
addListener(监听器);
//TODO api.RemovelListener(监听器)
},背压调节(缓冲);
}
}.
我运行了一个快速测试,效果很好,但我意识到它是单线程的。没什么大不了的:实际上RxJava的设计是单线程的,除非指定了
调度程序

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

所以我开始实现
Flowable.subscribeOn()
Scheduler.computation()
,这正是我想了解的地方:我在很多地方看到,建议使用Java的
ForkJoinPool.commonPool()
来运行计算任务,但RxJava2不使用它。我的主要问题是:

  • 这是否适合我的基本反应式实现
  • 为什么RxJava2选择实现自己的池而不是使用这个池
  • 这种方法是否有任何问题需要我注意,以使我的生活更轻松
谢谢

这是否适合我的基本反应式实现

向传统回调API编写适配器有些常见,假设还没有编写适配器

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

RxJava总是以Java6及以上为目标,
ForkJoinPool
是Java7。请注意,
commonPool
有时在调用线程上执行工作,而不是异步执行。由于相同的池死锁,我们在CI服务器上挂起了许多单元测试

实现RxJava2 API的一小部分 这种方法是否有任何问题需要我注意,以使我的生活更轻松

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


如果是后者,除了使用
commonPool
的警告之外,这取决于您尝试与之交互的内容。

这是一个很好的起点,谢谢!我正在重新实现我所需要的操作符(现在只需要一堆),但是如果我将来想切换到使用该库,我将遵循RxJava2的api和语义。当我试图了解每件事的工作原理并在网上搜索示例时,这也让我的生活变得更轻松:)。您关于
commonPool
在当前线程上执行工作的说明正是我不知道的问题之一,非常感谢!我会记下来的。听起来很棒!这就是我7-8年前学习反应式编程的方式,不同的是Rx.NET没有可用的资源,只有少数视频。我必须用C#编写并运行一个序列,然后用Java重现同样的效果,以此来进行实验。谢谢你们来到这里,为像我这样的人,经历了和你们一样的经历。感谢您编写了超级清晰的代码,以便在RxJava中学习:)。
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);
    }
}.