rxJava如何使flatMap在多线程上运行
我希望从flatMap发出的每个项目都在自己的线程上运行rxJava如何使flatMap在多线程上运行,java,multithreading,rx-java,rx-java3,Java,Multithreading,Rx Java,Rx Java3,我希望从flatMap发出的每个项目都在自己的线程上运行 这是一个实际使用的简化示例,其中每个项目都是url请求。 在每个线程上添加subscribeOn(Schedulers.io())仍然在单个线程上运行 这里的规则是什么 整数[]数组=新整数[100]; 对于(int i=0;i{ 返回Single.fromCallable(()->{ Log.i(标记“apply”+i+“”+Thread.currentThread().getName()); 返回i+1000; }) .subscr
这是一个实际使用的简化示例,其中每个项目都是url请求。
在每个线程上添加subscribeOn(Schedulers.io())仍然在单个线程上运行
这里的规则是什么
整数[]数组=新整数[100];
对于(int i=0;i<100;i++){
数组[i]=i+1;
}
可观察。从数组(数组)
.flatMapSingle(新函数(){
@凌驾
公共单源应用(整数i)抛出可丢弃{
Log.i(标记“apply”+i+“”+Thread.currentThread().getName());
返回Single.just(i).subscribeOn(Schedulers.io());
}
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.订阅(新观察员){
@凌驾
订阅时的公共无效(@NonNull-d){
}
@凌驾
public void onNext(@NonNull整数i){
//Log.i(标记“onNext”+Thread.currentThread().getName()+i);
}
@凌驾
公共无效onError(@NonNull可丢弃e){
}
@凌驾
未完成的公共空间(){
}
});
结果:
2020-12-16 22:54:47.010 10649-10700/com.example.rxjava I/MYTAG: apply 1 RxCachedThreadScheduler-1
2020-12-16 22:54:47.037 10649-10700/com.example.rxjava I/MYTAG: apply 2 RxCachedThreadScheduler-1
2020-12-16 22:54:47.038 10649-10700/com.example.rxjava I/MYTAG: apply 3 RxCachedThreadScheduler-1
2020-12-16 22:54:47.039 10649-10700/com.example.rxjava I/MYTAG: apply 4 RxCachedThreadScheduler-1
2020-12-16 22:54:47.040 10649-10700/com.example.rxjava I/MYTAG: apply 5 RxCachedThreadScheduler-1
2020-12-16 22:54:47.043 10649-10700/com.example.rxjava I/MYTAG: apply 6 RxCachedThreadScheduler-1
2020-12-16 22:54:47.051 10649-10700/com.example.rxjava I/MYTAG: apply 7 RxCachedThreadScheduler-1
2020-12-16 22:54:47.051 10649-10700/com.example.rxjava I/MYTAG: apply 8 RxCachedThreadScheduler-1
除了使用
just
之外,您的方法是正确的,它使用了一个现有的对象,因此无论之前创建和计算了什么对象。在本例中,是从同一线程调用的flatMapSingle
的lambda
您必须使计算本身成为流的一部分,以便通过fromCallable
并行运行,例如:
Observable.fromArray(数组)
.flatMapSingle(i->{
返回Single.fromCallable(()->{
Log.i(标记“apply”+i+“”+Thread.currentThread().getName());
返回i+1000;
})
.subscribeOn(Schedulers.io());
})
.observeOn(AndroidSchedulers.mainThread())
// ...
;
我真的不记得RxJava是如何工作的,但我似乎看到的是:*您的flatMapSingle
总是在同一个线程上运行,因为可观察的.fromArray
结果没有被告知不要这样做;*您似乎根本不需要flatMapSingle
;*不确定,但是订阅Schedulers.newThread()
甚至Schedulers.from(executor)
就可以了。这是否回答了您的问题?