Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.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
如何在Android上使用RxJava在多线程上运行subsciber_Android_Multithreading_Rx Java_Rx Android - Fatal编程技术网

如何在Android上使用RxJava在多线程上运行subsciber

如何在Android上使用RxJava在多线程上运行subsciber,android,multithreading,rx-java,rx-android,Android,Multithreading,Rx Java,Rx Android,我是RxJava新手,正在(我想)一个简单的问题上挣扎。我想在3个线程中同时处理订阅部分。这就是我使用FixedThread池的原因。示例代码: Observer.just("one", "two", "three", "four") .observeOn(Schedulers.io()) .subscribeOn(Schedulers.from(Executors.newFixedThreadPool(3)) .subscribe(new Observer<String>() {

我是RxJava新手,正在(我想)一个简单的问题上挣扎。我想在3个线程中同时处理订阅部分。这就是我使用FixedThread池的原因。示例代码:

Observer.just("one", "two", "three", "four")
.observeOn(Schedulers.io())
.subscribeOn(Schedulers.from(Executors.newFixedThreadPool(3))
.subscribe(new Observer<String>() {

    public void onNext(String string) {
        Log.d(TAG, "Started: " + string);
        SystemClock.sleep(1000);
        Log.d(TAG, "Ended: " + string);
    }

    (...)

}
实际结果:

Started: one
Ended: one
Started: two
Ended: two
Started: three
Ended: three
Started: four
Ended: four

我做错了什么?

RxJava观察值是连续的,
subscribeOn
observeOn
操作符不会并行运行值

最接近的方法是通过模键对值进行分组,通过
observeOn
运行值,并合并结果:

AtomicInteger count = new AtomicInteger();

Observable.range(1, 100)
.groupBy(v -> count.getAndIncrement() % 3)
.flatMap(g -> g
    .observeOn(Schedulers.computation())
    .map(v ->  Thread.currentThread() + ": " + v))
.toBlocking()
.forEach(System.out::println);

谢谢你的回答。但是,我是否正确理解,解决方案为每个线程“设置单独的队列”,因此如果任务占用的时间不相同,那么在结束时,一些线程可能会提前完成,而一个线程仍有多个任务要运行。我的问题是RxJava是否支持在多个线程之间使用共享队列?使用此设置或任何共享队列都不会窃取任何工作。
AtomicInteger count = new AtomicInteger();

Observable.range(1, 100)
.groupBy(v -> count.getAndIncrement() % 3)
.flatMap(g -> g
    .observeOn(Schedulers.computation())
    .map(v ->  Thread.currentThread() + ": " + v))
.toBlocking()
.forEach(System.out::println);