为什么主线程没有等待Scheduler线程的完成?

时间:2018-06-16 15:54:20

标签: rx-java

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()的完成?

1 个答案:

答案 0 :(得分:2)

这是设计的。 RxJava标准调度程序使用守护程序线程,以便它们不会阻止JVM退出。这意味着如果您希望完成调度程序的工作,则必须以某种形式保持非守护程序线程运行。