Java 订阅现有的observable,除非它';完成了

Java 订阅现有的observable,除非它';完成了,java,reactive-programming,rx-java,observable,Java,Reactive Programming,Rx Java,Observable,我已经多次需要这样的构造,但我不太知道如何实现它。我的问题是:当一个事件发生时,我想创建一个复杂的可观察对象(由几个操作符组合而成)。它将异步完成一些操作,发布结果并完成。同时,我想允许对这个可观察对象进行新的订阅,但一旦它完成,就应该创建新的可观察对象,它是第一个可观察对象的副本(或者只是做同样的事情) (编辑)作为一个例子,让我们有一个简单的可观测:observable obs=observable.just(true).delay(1,TimeUnit.SECONDS)。我的目标是以下行为

我已经多次需要这样的构造,但我不太知道如何实现它。我的问题是:当一个事件发生时,我想创建一个复杂的可观察对象(由几个操作符组合而成)。它将异步完成一些操作,发布结果并完成。同时,我想允许对这个可观察对象进行新的订阅,但一旦它完成,就应该创建新的可观察对象,它是第一个可观察对象的副本(或者只是做同样的事情)

(编辑)作为一个例子,让我们有一个简单的可观测:
observable obs=observable.just(true).delay(1,TimeUnit.SECONDS)
。我的目标是以下行为:

[毫秒:操作]

0:
obs.subscribe(…)
-我希望此可观察对象在~1s后完成

500:
obs.subscribe(…)
-此操作应在约500毫秒后完成

950:如上所述,应在50毫秒后完成

1500:原始可观测数据应该已经完成。我现在想重新开始一切,并在1s后在这里完成订阅

2000年:在这里,我想连接到最新的可观测数据,并期望它在500秒后完成(因为新的秒数从1500开始计算)


我不太知道如何以正确和线程安全的方式进行。我可以用一个可观察的对象来完成吗?

您可以使用
延迟
共享
来实现这一点

Observable<Long> o = Observable.defer(() ->
    Observable.just(System.currentTimeMillis()).delay(1, TimeUnit.SECONDS))
.share();

o.subscribe(System.out::println);   // T = 0
Thread.sleep(500);
o.subscribe(System.out::println);  // T = 500
Thread.sleep(450);
o.subscribe(System.out::println);   // T = 950

Thread.sleep(550);
o.subscribe(System.out::println);   // T = 1500
Thread.sleep(500);
o.subscribe(System.out::println);   // T == 2000

Thread.sleep(1000);
Observable o=可观察。延迟(()->
可观察。仅(System.currentTimeMillis())。延迟(1,时间单位。秒))
.share();
o、 订阅(System.out::println);//T=0
睡眠(500);
o、 订阅(System.out::println);//T=500
睡眠(450);
o、 订阅(System.out::println);//T=950
睡眠(550);
o、 订阅(System.out::println);//T=1500
睡眠(500);
o、 订阅(System.out::println);//T==2000
睡眠(1000);

第一个3将在1s后同时完成(值相同),第二个2将在第一个之后完成1.5s(值与第一个不同)。

有点模糊的描述,但听起来你需要
share
@akarnokd我知道
share
将如何帮助我共享可观察到的内容。当前一个已经完成时,我将如何重新创建可观察对象?我编辑了我的问题,使问题更清楚,牙床很多!事实上,我已经写了几乎完全相同的测试用例,但既然你们发布了答案,我很乐意接受。