observeOn的放置给了我不同的行为

时间:2018-01-03 09:49:02

标签: rx-java2

当我运行以下代码段时,我看不到背压。

public static void main(String[] args) throws InterruptedException {

    MyFileProcessor pro = new MyFileProcessor();
    Timer t = new Timer();
    t.start();
    Disposable x = pro
            .generateFlowable(
                    new File("path\\to\\file.raw"))
            .subscribeOn(Schedulers.io(), false).observeOn(Schedulers.io()).map(y -> {
                System.out.println(Thread.currentThread().getName() + " xxx");

                return y;
            })

            .subscribe(onNext -> {
                System.out.println(Thread.currentThread().getName() + " " + new String(onNext));
                Thread.sleep(100);
            }, Throwable::printStackTrace, () -> {
                System.out.println("Done");
                t.end();
                System.out.println(t.getTotalTime());
            });

    Thread.sleep(1000000000);

}  

当我上课时,我会得到一个交替的

RxCachedThreadScheduler-1 xxx
RxCachedThreadScheduler-1 Line1
....

它使用相同的线程。

现在当我将observeOn移动到订阅之前时,我看到了一堆 RxCachedThreadScheduler-1 xxx
接下来是一堆 RxCachedThreadScheduler-1 Line1

我假设这是背压,但使用的线程仍然是相同的。

为什么我会看到这种行为?
为什么只使用一个线程?
为观察操作而没有操作员,为什么我会看到这种行为?

[edit]

public Flowable<byte[]> generateFlowable(File file) {
    return Flowable.generate(() -> new BufferedInputStream(new FileInputStream(file)), (bufferedIs, output) -> {
        try {
            byte[] data = getMessageRawData(bufferedIs);
            if (data != null)
                output.onNext(data);
            else
                output.onComplete();

        }
        catch (Exception e) {
            output.onError(e);
        }
        return bufferedIs;
    }, bufferedIs -> {
        try {
            bufferedIs.close();
        }
        catch (IOException ex) {
            RxJavaPlugins.onError(ex);
        }
    });

}  

1 个答案:

答案 0 :(得分:1)

  

为什么只使用一个线程?

正确工作,因为你在 observeOn之后检查正在运行的线程,因此你应该在那里和下面看到相同的线程,不管它上面发生了什么。 subscribeOn影响generateFlowable我认为你不打印当前线程,因此你看不到它在不同的IO线程上运行。

  

现在,当我将observeOn移动到订阅

之前

除非generateFlowable发生奇怪的事情,否则应该没有任何区别。