public static void main(String[] args) throws InterruptedException {
Observable.range(1, 3)
.subscribeOn(Schedulers.computation())
.map(i-> compute(i))
.subscribe(i -> {
System.out.println(i);
});
System.out.println("last line");
}
public static int compute(Integer i) {
try {
System.out.println("compute integer i: " + i);
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return 10*i;
}
输出:
last line
compute integer i: 1
如果main方法将启动一个通常的线程,我们将看到完整的输出:
public static void main(String[] args) {
Thread a=new Thread(() -> {
compute(1);
compute(2);
compute(3);
});
a.start();
System.out.println("last line");
}
输出:
last line
compute integer i: 1
compute integer i: 2
compute integer i: 3
为什么主线程没有等待Schedulers.computation()线程的完成,而它等待通常新的Thread()的完成?
答案 0 :(得分:2)
这是设计的。 RxJava标准调度程序使用守护程序线程,以便它们不会阻止JVM退出。这意味着如果您希望完成调度程序的工作,则必须以某种形式保持非守护程序线程运行。