先看代码
implementation "io.reactivex.rxjava2:rxjava:2.2.3"
static class Event
{
private String msg;
private long time;
Event(String msg)
{
this.msg = msg;
time = System.currentTimeMillis();
}
public String toString()
{
return msg;
}
}
public static void main(String[] args) throws Exception
{
Observable<Event> sb = Observable.create(emitter -> {
for (int i = 0; i < 100; i++)
{
Event msg = new Event("事件" + i);
System.out.println("推送 :" + msg);
emitter.onNext(msg);
Thread.sleep(300);
}
});
ConnectableObservable<Event> ob = sb.subscribeOn(Schedulers.newThread()).publish();
ob.subscribe(s -> {
Thread.sleep(2000);
printEvent("打印机1号", s);
});
ob.subscribe(s -> {
printEvent("打印机2号", s);
});
ob.connect();
new Scanner(System.in).nextLine();
}
private static void printEvent(String tag, Event evt)
{
System.out.println(tag + " :" + evt + " ,延迟:" + (System.currentTimeMillis() - evt.time) + "ms");
}
这是简单的一个发布者,多个订阅者的示例。运行结果是这样的:
推送 :事件0
打印机1号 :事件0 ,延迟:2001ms
打印机2号 :事件0 ,延迟:2001ms
推送 :事件1
打印机1号 :事件1 ,延迟:2000ms
打印机2号 :事件1 ,延迟:2000ms
推送 :事件2
打印机1号 :事件2 ,延迟:2000ms
打印机2号 :事件2 ,延迟:2000ms
按我理解应该多个订阅者之间是不互相影响的,但输出结果很明显打印2号竟然受1号影响?
我期待的输出结果应该是这样的:
推送 :事件0
打印机2号 :事件0 ,延迟:1ms
推送 :事件1
打印机2号 :事件1 ,延迟:0ms
推送 :事件2
打印机2号 :事件2 ,延迟:0ms
推送 :事件3
打印机2号 :事件3 ,延迟:0ms
推送 :事件4
打印机2号 :事件4 ,延迟:0ms
推送 :事件5
打印机2号 :事件5 ,延迟:0ms
推送 :事件6
打印机2号 :事件6 ,延迟:0ms
打印机1号 :事件0 ,延迟:2000ms
推送 :事件7
打印机2号 :事件7 ,延迟:0ms
推送 :事件8
打印机2号 :事件8 ,延迟:0ms
推送 :事件9
打印机2号 :事件9 ,延迟:0ms
那么订阅者应该受其他订阅的影响吗?如果输出我期待的结果(订阅者独立)应该代码怎么修改?