我正在读一本有关RxJava的书,这是节选:
Observable.create(s -> {
... async subscription and data emission ...
})
.doOnNext(i -> System.out.println(Thread.currentThread()))
.filter(i -> i % 2 == 0)
.map(i -> "Value " + i + " processed on " + Thread.currentThread())
.subscribe(s -> System.out.println("SOME VALUE =>" + s));
System.out.println("Will print BEFORE values are emitted")”
他写道,由于该操作是异步的,因此值将在与订阅者线程不同的线程上发出。由于订阅者的线程是非阻塞的,因此Will print BEFORE values are emitted
将在任何值被推送到订阅者之前被打印。
我无法理解这个订户线程是什么?我能以某种方式获得它的名字吗?为了测试作者在说什么,我编写了一些代码:
Observable.create(
subscriber -> {
System.out.println("Entering thread: " + Thread.currentThread().getName());
Thread t =
new Thread(
new Runnable() {
@Override
public void run() {
try {
System.out.println(
"Emitting threads: " + Thread.currentThread().getName());
Thread.sleep(5000);
subscriber.onNext(1);
subscriber.onNext(2);
subscriber.onNext(3);
subscriber.onCompleted();
} catch (InterruptedException e) {
subscriber.onError(e);
}
}
});
t.start();
})
.subscribe(
a -> {
System.out.print("Subscriber thread: " + Thread.currentThread().getName() + " ");
System.out.println(a);
});
System.out.println("Main thread exiting:");
运行上面的代码时,我发现订户线程与在其上调用onNext()
的线程相同。由于这是异步操作,因此应该在与订户的线程不同的线程上发出项目。两个线程为什么一样?
此外,即使在主线程退出之后,该程序仍将继续运行并仅在通过onNext()将所有元素下推之后才终止。为什么会这样呢?为什么程序不退出?
答案 0 :(得分:1)
订户线程是正在调用subscribe
的线程。由于RxJava流是此类订阅调用的链,因此可以通过subscribeOn
将这些调用移动到序列中的其他线程。
例如:
Observable.fromCallable(() -> Thread.currentThread())
.subscribe(System.out::println);
System.out.println("Subscriber thread: " + Thread.currentThread());
这将打印两次订阅线程。或者
Observable.fromCallable(() -> Thread.currentThread())
.subscribeOn(Schedulers.single())
.subscribe(System.out::println);
System.out.println("Subscriber thread: " + Thread.currentThread());
Thread.sleep(1000);
这将打印用户线程和RxSingleScheduler线程。
答案 1 :(得分:0)
默认情况下,Rx是单线程的,这意味着Observable
和我们可以应用的运算符链将在调用其subscribe()
方法的同一线程上通知其观察者。