【发布时间】: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 并使用CompletableFuture 或JDeferred 完成?或者已经有一些不错的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