RxJava。可观察。延迟工作(末尾缺少一些项目)

RxJava。可观察。延迟工作(末尾缺少一些项目),java,rx-java,Java,Rx Java,我正在努力理解RxJava。我的测试代码是: import rx.Observable; import rx.Subscriber; import rx.functions.Action1; import java.util.concurrent.TimeUnit; public class Hello { public static void main(String[] args) { Observable<String> observable

我正在努力理解RxJava。我的测试代码是:

import rx.Observable;
import rx.Subscriber;
import rx.functions.Action1;

import java.util.concurrent.TimeUnit;

public class Hello {
    public static void main(String[] args) {

            Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                try {
                    Thread.sleep(1000);
                    subscriber.onNext("a");
                    Thread.sleep(1000);
                    subscriber.onNext("b");
                    Thread.sleep(1000);
                    subscriber.onNext("c");
                    Thread.sleep(1000);
                    subscriber.onNext("d");
                    Thread.sleep(1000);
                    subscriber.onNext("e");
                    Thread.sleep(1000);
                    subscriber.onNext("f");
                    Thread.sleep(1000);
                    subscriber.onNext("g");
                    Thread.sleep(1000);
                    subscriber.onNext("h");
                } catch (InterruptedException e) {
                    subscriber.onError(e);
                }
            }
        });

        observable
                .delay(2, TimeUnit.SECONDS)
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String string) {
                        System.out.println(string);
                    }
                });
    }
}
导入接收。可观察;
输入接收用户;
导入rx.functions.Action1;
导入java.util.concurrent.TimeUnit;
公共课你好{
公共静态void main(字符串[]args){
Observable-Observable=Observable.create(newobservable.OnSubscribe()){
@凌驾

public void call(订户您正在使用的调度的
延迟
重载在不同的线程上工作,并导致隐式争用条件。所有临时运算符(例如
延迟
缓冲区
,和
窗口
)需要使用调度程序为以后安排效果,如果您没有意识到并仔细使用,这可能会导致意外的争用条件。在这种情况下,延迟操作符将工作安排在单独的线程池中的下游。以下是测试中的执行顺序(在主线程上)

  • 您的Observable已订阅,并在下一个(“a”)
  • 接下来它被延迟接收。这将在2秒后调度下游onNext
  • 控制流立即返回到等待1000毫秒的可观测值
  • 可观察的
    onNext(“b”)
    延迟。延迟将“b”的onNext安排为2秒后
  • ..(重复)
  • 当您的可观察调用
    onNext(“h”)
    时,它会安排工作,然后立即从subscribe返回并终止测试(导致安排的工作消失)
  • 为了让它异步执行,您可以在trampoline调度器实现上安排延迟

    .delay(2, TimeUnit.SECONDS, Schedulers.trampoline())
    

    您的主线程在观察最终值之前退出。您可以长时间睡眠或使用ToBlock等待所有值。要使其异步,请使用
    调度程序。io
    工作正常!!请注意
    调度程序。io
    使用无限线程池。使用
    调度程序。计算
    用于有界线程池。计算通常用于CPU密集型工作,而IO用于潜在的阻塞工作。