我使用Rxjava2编写了以下代码:
public class RxSchTest {
public Observable<String> validate(String str){
return Observable.create(s->{
s.onNext(str+":v1");
System.out.println("run on threads "+Thread.currentThread());
});
}
@Test
public void testbackRun(){
// Observable<String>
for(int i =0;i<10;i++) {
validate("test"+i).observeOn(Schedulers.io()).subscribe(System.out::println);
}
}
}
输出是意料之外的:
在线程上运行Thread [main,5,main]
TEST0:V1
在线程上运行Thread [main,5,main]
test1:v1在线程上运行Thread [main,5,main]
TEST2:V1
在线程上运行Thread [main,5,main]
TEST3:V1
在线程上运行Thread [main,5,main]
TEST4:V1
在线程上运行Thread [main,5,main]
TEST5:V1
在线程上运行Thread [main,5,main]
TEST6:V1
在线程上运行Thread [main,5,main]
TEST7:V1
在线程上运行Thread [main,5,main]
test8:V1
在线程上运行Thread [main,5,main]
test9:V1
为什么所有观察者都在主线程上运行?
答案 0 :(得分:1)
您在默认(主)线程上创建Observable
,在之后创建线程切换到io
。因此,只有订阅者的打印发生在io
上。请记住,observeOn
运算符会切换下游线程。
如果您需要使用Observable
使用io
运算符而不是subscribeOn
订阅observeOn
。{/ p>
@Test
public void testbackRun(){
for(int i =0;i<10;i++) {
validate("test"+i)
.subscribeOn(Schedulers.io()) <---------------
.subscribe(System.out::println);
}
}
在这种情况下,整个流将在io
线程上发生。