当我运行以下代码段时,我看不到背压。
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);
}
});
}
答案 0 :(得分:1)
为什么只使用一个线程?
正确工作,因为你在 observeOn
之后检查正在运行的线程,因此你应该在那里和下面看到相同的线程,不管它上面发生了什么。 subscribeOn
影响generateFlowable
我认为你不打印当前线程,因此你看不到它在不同的IO线程上运行。
现在,当我将observeOn移动到订阅
之前
除非generateFlowable
发生奇怪的事情,否则应该没有任何区别。