RxJava-主杀死可观察的线程

时间:2018-11-23 10:00:26

标签: java multithreading rx-java

为什么主线程杀死了我的rxJava线程?

public static void main(final String[] args) throws Exception {
    Observable.just(10)
        .subscribeOn(Schedulers.newThread())
        .subscribe(i -> print(i));
    Thread.sleep(100);
}

private static void print(final int i) {
    try {
        Thread.sleep(5000);
    } catch(final InterruptedException e) {
        e.printStackTrace();
    }
    System.out.println(i);
}

print方法阻塞了5000毫秒的线程,我认为JVM正在等待应用程序下的所有线程终止。 在这种情况下,执行Thread.sleep(100)后,程序将关闭,并且在控制台中看不到10

注意:如果我将使用Executors.newFixedThreadPool(1);之类的自定义执行器,它将一直等到关机,但是使用Schedulers.newThread()则不会。

3 个答案:

答案 0 :(得分:4)

Schedulers.newThread()将充当守护程序线程:如果主线程完成-守护程序线程不会停止JVM的关闭。在此示例中,这个新的(守护程序)线程将进入print方法中并等待5秒,而主线程将仅等待0.1秒并仅完成main方法执行。就这样...

答案 1 :(得分:0)

如果不使用ThreadPool,则必须自己等待(加入)创建的线程,请参见join method;有一些超载。

您可以在Javadoc中获得有关ThreadPoolExecutor的所有解释,该解释为您提供了这种管理。

如果您需要更多信息,请告诉我。

答案 2 :(得分:0)

public static void main(String[] args) {

        Scheduler scheduler = Schedulers.from(Executors.newFixedThreadPool(10, Executors.defaultThreadFactory()));

        Observable.interval(1,TimeUnit.SECONDS)
                .doOnNext(word -> System.out.printf("%s uses thread %s%n", word,
                        Thread.currentThread().getName()))
                .subscribeOn(scheduler)
                .observeOn(Schedulers.io())
                .doOnNext(word -> System.out.printf("%s uses thread %s%n", word,
                        Thread.currentThread().getName()))
                .subscribe();
    }