Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.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
为什么我的RxJava可观察性没有引起订阅者的注意?_Java_Multithreading_Asynchronous_Reactive Programming_Rx Java - Fatal编程技术网

为什么我的RxJava可观察性没有引起订阅者的注意?

为什么我的RxJava可观察性没有引起订阅者的注意?,java,multithreading,asynchronous,reactive-programming,rx-java,Java,Multithreading,Asynchronous,Reactive Programming,Rx Java,我在摆弄RxJava,我想要流式传输一千个连续的整数。然后我想异步地将它们分割成奇数和偶数流,然后异步地打印它们 然而,我没有得到任何打印输出,或者至少是非常部分的输出。我错过了什么?我的日程安排错了吗?或者控制台在Eclipse中存在多线程问题 public static void main(String[] args) { List<Integer> values = IntStream.range(0,1000).mapToObj(i -> Integer.v

我在摆弄RxJava,我想要流式传输一千个连续的整数。然后我想异步地将它们分割成奇数和偶数流,然后异步地打印它们

然而,我没有得到任何打印输出,或者至少是非常部分的输出。我错过了什么?我的日程安排错了吗?或者控制台在Eclipse中存在多线程问题

public static void main(String[] args)  {

    List<Integer> values = IntStream.range(0,1000).mapToObj(i -> Integer.valueOf(i)).collect(Collectors.toList());

    Observable<Integer> ints = Observable.from(values).subscribeOn(Schedulers.computation());

    Observable<Integer> evens = ints.filter(i -> Math.abs(i) % 2 == 0);
    Observable<Integer> odds = ints.filter(i -> Math.abs(i) % 2 != 0);

    evens.subscribe(i -> System.out.println(i + " IS EVEN " + Thread.currentThread().getName()));

    odds.subscribe(i -> System.out.println(i + " IS ODD " + Thread.currentThread().getName()));
}
publicstaticvoidmain(字符串[]args){
List values=IntStream.range(01000).mapToObj(i->Integer.valueOf(i)).collect(Collectors.toList());
Observable ints=Observable.from(values).subscribeOn(Schedulers.computation());
可观测evens=int.filter(i->Math.abs(i)%2==0);
可观测赔率=整数过滤器(i->Math.abs(i)%2!=0);
evens.subscribe(i->System.out.println(i+)是偶数“+Thread.currentThread().getName());
subscribe(i->System.out.println(i+“是奇数”+Thread.currentThread().getName());
}

您正在使用运行守护程序线程的
Schedules.computation
启动处理管道。因此,当
main
线程完成时,这些线程将在处理可观察到的数据之前终止


因此,如果您希望看到打印的结果,您可以让主线程等待结果(例如,通过
thread.sleep
)或通过删除
subscribebeon
来订阅调用线程。还有一个选项可以创建您自己的调度程序,它将运行非守护进程线程。

ohhhh。。。嗯,我需要告诉主线程等一下。等一下,让我试试。或者订阅当前线程而不是另一个调度程序。让我更新答案。我在
main()
方法的末尾添加了
Thread.sleep()
,只是为了让流有机会运行。谢谢我试图模拟一个异步环境,所以我不想让它在主线程上运行。我想我希望应用程序像一个尚未关闭的线程池一样保持活动状态。@ThomasN
Scheduler
只是专门为Rx需求设计的一个抽象,并没有将1:1转换为
ExecutorService
的设计目的。实际上你可以。