rxjava zip在指定的调度程序上不工作?

rxjava zip在指定的调度程序上不工作?,java,observable,jax-rs,rx-java,reactive-programming,Java,Observable,Jax Rs,Rx Java,Reactive Programming,我有一个实现,其中我有两个单变量,它们是对数据库的并行调用,用于获取对象。然后我使用rxjavazip操作符来聚合结果。如下图所示: ... (other code) Single<A> a = Single.fromCallable(() -> { System.out.println("Inside single a, running in thread " + Thread.currentThread().getName()); })

我有一个实现,其中我有两个单变量,它们是对数据库的并行调用,用于获取对象。然后我使用rxjavazip操作符来聚合结果。如下图所示:

...
(other code)

Single<A> a = Single.fromCallable(() -> {
        System.out.println("Inside single a, running in thread " + Thread.currentThread().getName());
}).subscribeOn(Schedulers.io);

Single<B> b = Single.fromCallable(() -> {
        System.out.println("Inside single b, running in thread " + Thread.currentThread().getName());
}).subscribeOn(Schedulers.io);

Single<C> result = Single.zip(a, b, aggregationFunc2())
    .subscribeOn(Schedulers.computation())
    .subscribe(response::resume, response::resume);
。。。
(其他守则)
单个a=单个.fromCallable(()->{
System.out.println(“在单个a内部,在线程中运行”+thread.currentThread().getName());
}).subscribeOn(Schedulers.io);
单个b=单个.fromCallable(()->{
System.out.println(“在单个b内部,在线程中运行”+thread.currentThread().getName());
}).subscribeOn(Schedulers.io);
Single result=Single.zip(a、b、aggregationFunc2())
.subscribeOn(Schedulers.computation())
.subscribe(response::resume,response::resume);
private Func2 aggregationFunc2(){
System.out.println(“内部聚合函数2,在线程中运行”+线程.currentThread().getName());
返回(a,b)->{
CBuilder CBuilder=newbuilder();
如果(a!=null){
cBuilder.setA(a);
}
如果(b!=null){
cBuilder.setB(b);
}           
返回cBuilder.build();
};
}
然而,我得到的记录是,a和b都在IO线程池中运行,具有不同的IO线程,比如IO-2和IO-3。这是意料之中的,因为我将每一个都指定在IO调度程序中。但zip函数仍然在默认主线程中运行,而我希望它在计算线程中运行。不知道为什么,知道吗


另外,我尝试了observeOn()for zip,它仍然在默认主线程中运行。

因为您在主线程上调用了
aggregationFunc2

稍微重写一下代码会暴露出误解:

Func2 f=aggregationFunc2();
单个结果=Single.zip(a、b、f);
在创建和返回函数本身之前进行打印。您必须将print语句移动到已创建的函数中:

private Func2 aggregationFunc2(){
返回(a,b)->{
System.out.println(“内部聚合函数2,在线程中运行”
+Thread.currentThread().getName());
CBuilder CBuilder=newbuilder();
如果(a!=null){
cBuilder.setA(a);
}
如果(b!=null){
cBuilder.setB(b);
}           
返回cBuilder.build();
};
}

因为您在主线程上调用了
aggregationFunc2

稍微重写一下代码会暴露出误解:

Func2 f=aggregationFunc2();
单个结果=Single.zip(a、b、f);
在创建和返回函数本身之前进行打印。您必须将print语句移动到已创建的函数中:

private Func2 aggregationFunc2(){
返回(a,b)->{
System.out.println(“内部聚合函数2,在线程中运行”
+Thread.currentThread().getName());
CBuilder CBuilder=newbuilder();
如果(a!=null){
cBuilder.setA(a);
}
如果(b!=null){
cBuilder.setB(b);
}           
返回cBuilder.build();
};
}
private Func2<a, b, c> aggregationFunc2() {
        System.out.println("Inside aggregationFunc2, running in thread " + Thread.currentThread().getName());
        return (a, b) -> {
            CBuilder cBuilder = new Builder();
            if (a != null) {
                cBuilder.setA(a);
            }
            if (b != null) {
                cBuilder.setB(b);
            }           
            return cBuilder.build();
        };
    }