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

Rxjava schedule wont run after last line

我是 RX 的新手,我不知道调度程序是如何工作的。下面是一些永远不会 运行 onComplete 的代码。但是如果我在末尾放置一个 while(true) 循环,它就可以正常工作。它接缝应用程序将在 运行ning 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);

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

至于为什么会出现这种情况。

This answer 引用:

The Java Virtual Machine continues to execute threads until either of the following occurs:

...

All threads that are not daemon threads have died ...

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

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,从而产生 non-daemon 个线程。