RxJava异步订阅将丢失消息

时间:2017-06-23 17:54:59

标签: rx-java2

我正在学习RxJava异步订阅的工作原理。但是有些问题使我感到困惑。

@Test public void testCreateAsync() throws InterruptedException {
  Observable<String> observable = Observable.create(emitter -> {
    for (int i = 0; i < 10; i++) {
      if (!emitter.isDisposed()) {
        int finalI = i;
        new Thread(() -> emitter.onNext("value_" + finalI)).start();
      }
    }
    if (!emitter.isDisposed()) {
      emitter.onComplete();
    }
  });

  observable.subscribe(System.out::println);
}

上述代码运行正常,并将value_1打印到value_9。但是当我在订阅之前添加一个睡眠时,最后一条消息value_9将不会被打印出来,如下所示:

@Test public void testCreateAsync() throws InterruptedException {
  ...
  Thread.sleep(3000);
  observable.subscribe(System.out::println);
}

有关此问题的任何讨论都表示赞赏。

ps:java版本为1.8,RxJava版本为2.1.1

1 个答案:

答案 0 :(得分:0)

有两个问题:

  1. 同时从不同的线程调用onNext
  2. onComplete可以在之前的线程能够发出其值以防止任何进一步的onNext发射之前执行。
  3. 睡眠没有特别的影响,重复执行上面的代码有时会产生这种行为。

    (我不清楚你想通过这种设置实现什么目标。)

相关问题