Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带时间间隔的Rx(Java反应式扩展)Zip运算符_Java_Multithreading_Reactive Programming_Rx Java - Fatal编程技术网

带时间间隔的Rx(Java反应式扩展)Zip运算符

带时间间隔的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的

我对RxJava比较陌生,我已经和操作符打了一段时间交道

我看到了这个小示例,它在短时间间隔(1s)后发射项目:

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();