Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否在所有事件后或每次事件后通知订阅者?_Java_Observable_Rx Java_Reactive Programming_Rx Java3 - Fatal编程技术网

Java 是否在所有事件后或每次事件后通知订阅者?

Java 是否在所有事件后或每次事件后通知订阅者?,java,observable,rx-java,reactive-programming,rx-java3,Java,Observable,Rx Java,Reactive Programming,Rx Java3,我是RxJava新手,我的印象是,每次事件都会通知每个订阅者。因此,如果我们有N个订阅者和X个事件流,那么N个订阅者中的每一个的onNext都将被调用。但当我运行以下代码时: public static void main(String[] args) { Observable<String> source = Observable.create(emitter -> { emitter.onNext("Hello")

我是RxJava新手,我的印象是,每次事件都会通知每个订阅者。因此,如果我们有N个订阅者和X个事件流,那么N个订阅者中的每一个的
onNext
都将被调用。但当我运行以下代码时:

public static void main(String[] args) {
        Observable<String> source = Observable.create(emitter -> {
            emitter.onNext("Hello");
            emitter.onNext("Foo");
            emitter.onNext("Bar");
            emitter.onNext("RxJava");
        });

        source.subscribe(e -> System.out.println("Observer 1: " + e));
        source.subscribe(e -> System.out.println("Observer 2: " + e));
    } 
因此,基本上,在完成所有的
onNext
之后,下一个观察者才会被触发

我希望看到:

Observer 1: Hello 
Observer 2: Hello
Observer 1: Foo
Observer 2: Foo
Observer 1: Bar
Observer 2: Bar
Observer 1: RxJava
Observer 2: RxJava 

在我看来,这对于很长的流来说效率很低,我做错了什么吗?

RxJava序列默认是同步的,因此上面的subscribe调用将在那里运行您的发射代码。为了实现交错,您需要一种方法来告诉源何时两个消费者都准备好接收。这可以通过以下几种方式实现:

ConnectableObservable源=可观测。创建(发射器->{
emitter.onNext(“你好”);
emitter.onNext(“Foo”);
发射器.onNext(“条”);
onNext(“RxJava”);
}).publish();
source.subscribe(e->System.out.println(“观察者1:+e”);
订阅(e->System.out.println(“观察者2:+e”);
source.connect();

ConnectableObservable源=可观测。创建(发射器->{
emitter.onNext(“你好”);
emitter.onNext(“Foo”);
发射器.onNext(“条”);
onNext(“RxJava”);
}).publish().refCount(2);
source.subscribe(e->System.out.println(“观察者1:+e”);
订阅(e->System.out.println(“观察者2:+e”);

RxJava序列默认情况下是同步的
是的,但我想到的是对每个字符串的所有观察者进行顺序循环,因此不涉及并发性。您能详细说明这两种方法的作用吗?我对RxJavaI是完全陌生的,我想它应该是(订阅者:subscribers)subscribe.next(value)的
for(订阅者:subscribers)
为每个值调用
connect
refcount
publish
上究竟做了什么?
connect
:允许您在要求可观察对象发出之前排列观察者
refCount
在有一定数量的观察者准备就绪时建立此连接
publish
为每个观察者执行该操作,而无需多次运行observable。
Observer 1: Hello 
Observer 2: Hello
Observer 1: Foo
Observer 2: Foo
Observer 1: Bar
Observer 2: Bar
Observer 1: RxJava
Observer 2: RxJava