【问题标题】:Rxjava schedule wont run after last lineRxjava 调度程序不会在最后一行之后运行
【发布时间】:2016-04-06 11:33:45
【问题描述】:

我是 RX 新手,我不知道调度程序是如何工作的。下面是一些从未运行过的代码 onComplete 。但如果我在最后放一个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);

【问题讨论】:

    标签: java scheduler reactive-programming rx-java


    【解决方案1】:

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

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

    This answer 引号:

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

    ...

    所有不是守护线程的线程都死掉了……

    现在,如果我们查看为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() 并通过您自己的ThreadFactory 传入自定义Executor,从而生成非守护线程。

    【讨论】:

    • 谢谢!但不只是寻找一个可行的解决方案。寻找正确的方法。如果newThread 需要 5 秒呢?
    • @sajad 我已经扩展了我的答案一点
    猜你喜欢
    • 1970-01-01
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    相关资源
    最近更新 更多