为什么我的RxJava可观察性没有引起订阅者的注意?
我在摆弄RxJava,我想要流式传输一千个连续的整数。然后我想异步地将它们分割成奇数和偶数流,然后异步地打印它们 然而,我没有得到任何打印输出,或者至少是非常部分的输出。我错过了什么?我的日程安排错了吗?或者控制台在Eclipse中存在多线程问题为什么我的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
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()
,只是为了让流有机会运行。谢谢我试图模拟一个异步环境,所以我不想让它在主线程上运行。我想我希望应用程序像一个尚未关闭的线程池一样保持活动状态。@ThomasNScheduler
只是专门为Rx需求设计的一个抽象,并没有将1:1转换为ExecutorService
的设计目的。实际上你可以。