Java 单个可观察对象是否会按顺序通知其所有观察者?
我根据一个Java 单个可观察对象是否会按顺序通知其所有观察者?,java,rx-java,Java,Rx Java,我根据一个PublishSubject编写了一个observativeList。每次客户端向该列表添加一个元素时,观察者都会通过onNext方法得到关于该主题的通知 我对两个示例观察员进行了编码,并将其订阅到observeList。我注意到通知是顺序的和阻塞的。因此,如果我订阅了这两位观察员,则会发生以下情况: 观察员收到通知的顺序与订阅的顺序相同 如果一个观察者正在阻塞,那么只有在前一个观察者结束其执行时,才会通知下一个观察者 我真的不在乎调用是连续的,但我想了解为什么通知也会阻塞,以及如
PublishSubject
编写了一个observativeList
。每次客户端向该列表添加一个元素时,观察者都会通过onNext
方法得到关于该主题的通知
我对两个示例观察员进行了编码,并将其订阅到observeList
。我注意到通知是顺序的和阻塞的。因此,如果我订阅了这两位观察员,则会发生以下情况:
- 观察员收到通知的顺序与订阅的顺序相同
- 如果一个观察者正在阻塞,那么只有在前一个观察者结束其执行时,才会通知下一个观察者
可观察列表的代码
package co.com.subjects.example;
import java.util.ArrayList;
import java.util.List;
import rx.Observable;
import rx.functions.Action1;
import rx.subjects.PublishSubject;
public class ObservableList<T>{
public String nombre;
protected final List<T> list;
protected final PublishSubject<T> onAdd;
public ObservableList(String nombre) {
this.list = new ArrayList<T>();
this.onAdd = PublishSubject.create();
this.nombre = nombre;
}
public void add(T value) {
list.add(value);
onAdd.onNext(value);
}
public Observable<T> getObservable() {
return onAdd;
}
}
package co.com.subjects.example;
导入java.util.ArrayList;
导入java.util.List;
进口接收。可观察;
导入rx.functions.Action1;
导入rx.subject.PublishSubject;
公共类观察者{
公共字符串名称;
受保护的最终清单;
受保护的最终出版主题为ADD;
公共可观察列表(字符串名称){
this.list=new ArrayList();
this.onAdd=PublishSubject.create();
this.nombre=nombre;
}
公共无效添加(T值){
列表。添加(值);
onAdd.onNext(值);
}
公共可观察的getObservable(){
在ADD上返回;
}
}
您可以将观察者包装在观察者中,并在ExecutorService中通知它,从而使其成为非阻塞的
显然,将任务添加到另一个池是相当昂贵的,所以我只会在您知道这需要一段时间的情况下才这样做。另外请注意,除非您小心,否则以这种方式发布的事件可能会出现混乱。一个简单的解决方案是为每个侦听器提供一个单线程执行器
想了解通知被阻止的原因吗
RxJava的实现假设执行观察者的onNext
方法总是快速且廉价的,因此PublishSubject
只需逐个调用其观察者的所有onNext
方法,而不引入任何并发性
还有,我怎样才能使它不被阻塞呢
在订阅观察器之前,您可以插入.observeOn(Schedulers.computation())
(或者根据需要插入不同的计划程序),以便在线程池上执行onNext
调用