为什么主线程杀死了我的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()
则不会。
答案 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();
}