Rxjava计划不会在最后一行之后运行

时间:2016-01-02 09:15:20

标签: java scheduler reactive-programming rx-java

我是RX的新手,我不知道调度程序是如何工作的。下面是一些从不运行while(true)的代码。但如果我在最后放置new thread循环它可以正常工作。它会在运行Subscriber<String> subscriber = new Subscriber<String>() { @Override public void onCompleted() { System.out.println("done"); } @Override public void onError(Throwable throwable) { } @Override public void onNext(String o) { System.out.println(o); } }; Observable.from(new String[]{"1", "2", "3","4"}). subscribeOn(Schedulers.immediate()) .observeOn(Schedulers.newThread()) .subscribe(subscriber); 之前退出应用程序。

为什么会这样?以及如何解决这个问题?

{{1}}

1 个答案:

答案 0 :(得分:3)

如果你的程序过早退出,只需添加Thread.sleep(1000);作为最后一个语句。

至于为什么会发生这种情况。

This answer语录:

  

Java虚拟机继续执行线程,直到发生以下任一情况:

     

...

     

所有非守护程序线程的线程都已死...

现在,如果我们查看为RxThreadFactory生成线程的Schedulers

public final class RxThreadFactory extends AtomicLong implements ThreadFactory {

    ...

    @Override
    public Thread newThread(Runnable r) {
        Thread t = new Thread(r, prefix + incrementAndGet());
        t.setDaemon(true);
        return t;
    }
}

因此,更复杂的解决方案是使用Schedulers.from()并使用自己的Executor传递自定义ThreadFactory,以生成非守护程序线程。