关于顺序处理的RX Java 2合同
TL;DR-是否可以保证默认情况下,在观察Observable发出的事件时,在任何给定时间内只使用一个线程 在我看来,RxJava2通常是顺序的,除非通过类似parallel()的方式表示。即使使用observeOn/subscribeOn,我也发现doOnNext()从未有两个线程同时运行:关于顺序处理的RX Java 2合同,java,rx-java,rx-java2,Java,Rx Java,Rx Java2,TL;DR-是否可以保证默认情况下,在观察Observable发出的事件时,在任何给定时间内只使用一个线程 在我看来,RxJava2通常是顺序的,除非通过类似parallel()的方式表示。即使使用observeOn/subscribeOn,我也发现doOnNext()从未有两个线程同时运行: AtomicInteger计数器=新的AtomicInteger(); PublishSubject testSubject=PublishSubject.create(); 测试对象 .observeO
AtomicInteger计数器=新的AtomicInteger();
PublishSubject testSubject=PublishSubject.create();
测试对象
.observeOn(Schedulers.io())
.doOnNext(val->{
if(counter.incrementAndGet()>1)
System.out.println(“哇!!!!”);//
删除线程。睡眠(10);
轰炸主题
在worker中睡眠更长时间,以模拟运行时间更长的任务
在循环下添加Thread.sleep(10000)
,以便main线程等待后台线程完成其工作
如果要强制每个辅助线程在新线程上运行,请更改线程池.subscribeOn(Schedulers.newThread())
从
被观察者必须连续地向观察者发出通知(不是以
并行)。它们可能会从不同的线程发出这些通知,
但必须有一个正式的关系发生之前,双方之间的关系
通知
在您的示例中,您没有违反此可观察契约。但如果您实现了observable
错误,则两个线程将同时运行:
AtomicInteger counter = new AtomicInteger();
Observable.create(emitter -> {
new Thread(() -> {
for (int i = 0; i < 10000; i++) {
try {
Thread.sleep(1);
emitter.onNext(i);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}).start();
for (int i = 0; i < 10000; i++) {
Thread.sleep(1);
emitter.onNext(i);
}
}).doOnNext(integer -> {
if (counter.incrementAndGet() > 1)
System.out.println("Whoaa!");
counter.decrementAndGet();
Thread.sleep(1);
}).subscribe();
AtomicInteger计数器=新的AtomicInteger();
可观察。创建(发射器->{
新线程(()->{
对于(int i=0;i<10000;i++){
试一试{
睡眠(1);
下一步(i);
}捕捉(中断异常e1){
e1.printStackTrace();
}
}
}).start();
对于(int i=0;i<10000;i++){
睡眠(1);
下一步(i);
}
}).doOnNext(整数->{
if(counter.incrementAndGet()>1)
System.out.println(“哇!”);
counter.decrementAndGet();
睡眠(1);
}).subscribe();
似乎你可以通过observeOn
解决这个问题,我想问题是“是否保证默认情况下只使用一个线程”,这不是答案。谢谢@eis-是的,这几乎就是问题所在。我将它添加到原始帖子中,感谢你让它更清晰。谢谢@zella!这似乎是我需要的。
AtomicInteger counter = new AtomicInteger();
Observable.create(emitter -> {
new Thread(() -> {
for (int i = 0; i < 10000; i++) {
try {
Thread.sleep(1);
emitter.onNext(i);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
}
}).start();
for (int i = 0; i < 10000; i++) {
Thread.sleep(1);
emitter.onNext(i);
}
}).doOnNext(integer -> {
if (counter.incrementAndGet() > 1)
System.out.println("Whoaa!");
counter.decrementAndGet();
Thread.sleep(1);
}).subscribe();