RxJava。可观察。延迟工作(末尾缺少一些项目)
我正在努力理解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
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”)
onNext(“b”)
延迟。延迟将“b”的onNext安排为2秒后onNext(“h”)
时,它会安排工作,然后立即从subscribe返回并终止测试(导致安排的工作消失).delay(2, TimeUnit.SECONDS, Schedulers.trampoline())
您的主线程在观察最终值之前退出。您可以长时间睡眠或使用ToBlock等待所有值。要使其异步,请使用
调度程序。io
工作正常!!请注意调度程序。io
使用无限线程池。使用调度程序。计算
用于有界线程池。计算通常用于CPU密集型工作,而IO用于潜在的阻塞工作。