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
调用