可观察缓存发出的物品还是没有?

时间:2016-05-16 14:23:32

标签: java rx-java reactive-programming

Observable是否会缓存发出的项目?我有两个测试可以得出不同的结论:

从测试#1我得出结论:

测试#1:

Observable<Long> clock = Observable
    .interval(1000, TimeUnit.MILLISECONDS)
    .take(10)
    .map(i -> i++);

//subscribefor the first time
clock.subscribe(i -> System.out.println("a: " + i)); 

//subscribe with 2.5 seconds delay
Executors.newScheduledThreadPool(1).schedule(
    () -> clock.subscribe(i -> System.out.println("  b: " + i)),
    2500,
    TimeUnit.MILLISECONDS
);

输出#1:

a: 0
a: 1
a: 2
  b: 0
a: 3
  b: 1

但是第二次测试显示我们为两个观察者获得了不同的值:

测试#2:

Observable<Integer> observable  = Observable
                .range(1, 1000000)
                .sample(7, TimeUnit.MILLISECONDS);
observable.subscribe(i -> System.out.println("Subscriber #1:" + i));
observable.subscribe(i -> System.out.println("Subscriber #2:" + i)); 

输出#2:

Subscriber #1:72745
Subscriber #1:196390
Subscriber #1:678171
Subscriber #2:336533
Subscriber #2:735521

1 个答案:

答案 0 :(得分:1)

存在两种Observable:热和冷。寒冷的观察者倾向于为其观察者生成相同的序列,除非你有外部效应,例如与之相关的基于计时器的动作。

在第一个例子中,你得到两次相同的序列,因为除了你一个接一个的计时器滴答之外没有外部效果。在第二个示例中,您对快速源进行采样,并且随时间采样具有非确定性效果:每纳秒计数,因此即使最轻微的不精确也会导致报告的值不同。