Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.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如何使flatMap在多线程上运行_Java_Multithreading_Rx Java_Rx Java3 - Fatal编程技术网

rxJava如何使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

我希望从flatMap发出的每个项目都在自己的线程上运行
这是一个实际使用的简化示例,其中每个项目都是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)
就可以了。这是否回答了您的问题?