【问题标题】:Waiting for object creation or accessing it immediately if it already exists等待对象创建或者如果它已经存在则立即访问它
【发布时间】:2018-10-27 05:15:01
【问题描述】:

我今天遇到了以下问题:我们有一个类Foo,其中有一个Bar 的实例。一个方法initBar()在类的生命周期中的某个时刻被调用(这是非常异步的,大量的RxJava),它确实是bar = new Bar()

现在,问题是我想在其他方法doStuff() 中访问bar,不能保证在initBar() 之后调用,所以bar 仍然可以是null或者已经存在。

如果bar 已经存在,我想立即同步运行函数analyze(bar),如果它仍然是null - 我想安排它在设置bar 后运行(作为initBar() 的一部分称呼)。

额外问题:如何指定应该在哪个线程上执行analyze(bar);如果多个方法要访问bar怎么办;如何安全地取消这些。

现在,我知道如何使用 RxJava 实现这一点:添加额外的 PublishSubject<Bar> subject 并订阅它,同时调用 .repeat() 以获取已设置的值,然后从 initBar() 执行 subject.onNext(bar)。这很容易。它甚至涵盖了从多个地方访问它并指定一个线程来运行代码的情况。

但我觉得我在这里重新发明了一个轮子——当你想访问一个对象而不用担心它是否已经设置时,可能有解决这类问题的方法。是否应该考虑 Promise 并使用CompletableFutureJDeferred 完成?或者已经有一些不错的RxJava 配方了吗?必须有一些干净和简单的东西......

这里是Foo的完整代码供参考:

class Foo {
    Bar bar;

    void initBar() { bar = new Bar(); }

    void doStuff() {
         //This is the missing piece
         doWhenBar(bar -> analyze(bar));
    }

    void lifecycle1() {
        Observable.create(..)
            ...
            .doOnNext(this::initBar())
            ...
    }

    void lifecycle2() {
        Observable.create(..)
            ...
            .subscribe(this::doStuff())
    }

    //More methods where lifecycle1() and lifecycle2() can be called in random order
    ...
}

【问题讨论】:

    标签: java multithreading concurrency rx-java


    【解决方案1】:

    如果bar 只创建一次,请使用SingleSubject,现在您可以对创建的Bar 做出反应:

    class Foo {
        final SingleSubject<Bar> bar = SingleSubject.create();
    
        void initBar() { bar.onSuccess(new Bar()); }
    
        Single<Bar> doStuff() {
             //This is the missing piece
             return bar.observeOn(Schedulers.computation())
             .doOnSuccess(b -> analyze(b));
        }
    
        void lifecycle1() {
            Observable.create(..)
            ...
            .doOnNext(this::initBar())
            ...
        }
    
        void lifecycle2() {
            Observable.create(..)
            ...
            .concatMapSingle(this::doStuff)
            .subscribe(...)
        }
    
    // More methods where lifecycle1() and lifecycle2()
    // can be called in random order
    ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-08
      • 1970-01-01
      • 1970-01-01
      • 2021-02-28
      • 2015-03-31
      • 2019-09-10
      • 1970-01-01
      相关资源
      最近更新 更多