带时间间隔的Rx(Java反应式扩展)Zip运算符
我对RxJava比较陌生,我已经和操作符打了一段时间交道 我看到了这个小示例,它在短时间间隔(1s)后发射项目:带时间间隔的Rx(Java反应式扩展)Zip运算符,java,multithreading,reactive-programming,rx-java,Java,Multithreading,Reactive Programming,Rx Java,我对RxJava比较陌生,我已经和操作符打了一段时间交道 我看到了这个小示例,它在短时间间隔(1s)后发射项目: observed data=可观察的。只是(“一”、“二”、“三”、“四”、“五”); 可观察的.zip(数据,可观察的.interval(1,TimeUnit.SECONDS),(d,t)->{ 返回d+“”+t; }).toBlocking().forEach(System.out::println); 这是可行的,但是当我删除将源代码变成BlockingObservable的
observed data=可观察的。只是(“一”、“二”、“三”、“四”、“五”);
可观察的.zip(数据,可观察的.interval(1,TimeUnit.SECONDS),(d,t)->{
返回d+“”+t;
}).toBlocking().forEach(System.out::println);
这是可行的,但是当我删除将源代码变成BlockingObservable的toBlocking()
时,程序将执行,并且结束时没有输出
我通常通过查看大理石图来正确理解事物:
在最后一句话中,它说:它将只发射与发射最少项目的可观测源发射的项目数量相同的项目
这是否意味着,数据
可观测数据在不到1秒的时间内发出所有项目,并在打印每个可观测数据的前两个项目之前结束?因为每个可观察对象本身都是异步的
我需要清楚地了解正在发生的事情,以及是否有其他方法来处理类似的案件。有人吗?基本上,你的主程序是在被观察者有机会发射任何东西之前退出的,这就是你没有看到任何输出的原因。修复它的方法是以某种方式阻止,直到
可观察的
发出所有项目,这里有一种方法使用倒计时闩锁
:
CountDownLatch latch = new CountDownLatch(1);
Observable<String> data = Observable.just("one", "two", "three", "four", "five");
Observable.zip(data, Observable.interval(1, TimeUnit.SECONDS), (d, t) -> {
return d + " " + t;
}).finallyDo(latch::countDown).forEach(System.out::println);
latch.await(10, TimeUnit.SECONDS);
CountDownLatch闩锁=新的CountDownLatch(1);
可观察的数据=可观察的。只是(“一”、“二”、“三”、“四”、“五”);
可观察的.zip(数据,可观察的.interval(1,TimeUnit.SECONDS),(d,t)->{
返回d+“”+t;
}).finallyDo(闩锁::倒计时).forEach(系统输出::println);
等待(10,时间单位秒);
可观察。间隔
在封面下使用一个调度程序
。它将从另一个线程发出。同时,主线程已经完成了它的所有组成,并且将退出。假设您在main
方法中有此代码,这就是程序退出的原因
在实际系统中,这不应该是一个问题(除非您的实际系统是一个包含此代码的main
方法)
在一个示例程序中,您可以通过从stdin读取一个字节来导致主线程阻塞。大概是这样的:
Observable<String> data = Observable.just("one", "two", "three", "four", "five");
Observable.zip(data, Observable.interval(1, TimeUnit.SECONDS), (d, t) -> d + " " + t)
.subscribe(System.out::println);
System.in.read();
observed data=可观察的。只是(“一”、“二”、“三”、“四”、“五”);
可观察的.zip(数据,可观察的.interval(1,TimeUnit.SECONDS),(d,t)->d+“”+t)
.subscribe(System.out::println);
System.in.read();
另请参见,您可能希望查看非静态的可观察.zipWith
。更流畅。所以这不是关于异步,只是计时器运行在不同的线程和zip(With)操作符上在两个压缩的可观测对象都发射出某些东西之前不要发射…?是的-zip
生成一个可观测的
,它在两个压缩的可观测对象发射出某些东西之前不会发射任何东西。这很好。它与toBlocking()有何不同?好吧,两者都做相同的事情,在这个意义上,两者都会阻止,直到可观察到有机会发射为止,但以不同的方式进行。第一种方法是调用toBlocking
创建一个完全不同的类型BlockingObservable
,从而改变底层行为。第二种方法是使用可观察的
本身,但让它有机会使用闩锁发射项目。这纯粹是为了测试任何一种方法,对于一个真实的系统,您不应该使用这两种方法中的任何一种
Observable<String> data = Observable.just("one", "two", "three", "four", "five");
Observable.zip(data, Observable.interval(1, TimeUnit.SECONDS), (d, t) -> d + " " + t)
.subscribe(System.out::println);
System.in.read();