关于顺序处理的RX Java 2合同

关于顺序处理的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

TL;DR-是否可以保证默认情况下,在观察Observable发出的事件时,在任何给定时间内只使用一个线程

在我看来,RxJava2通常是顺序的,除非通过类似parallel()的方式表示。即使使用observeOn/subscribeOn,我也发现doOnNext()从未有两个线程同时运行:

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();