Concurrency 使用ForkJoinPool.commonPool()代替RxJava';s计算调度器
我目前正在为一个个人项目实现RxJava2 API的一小部分。我有一个基于侦听器的API,我开始编写代码来包装我的侦听器,并实现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
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);
}
}.