Multithreading RxJava:理解并发执行
在我下面的例子中(Kotlin,但基本原理相同)Multithreading RxJava:理解并发执行,multithreading,rx-java,Multithreading,Rx Java,在我下面的例子中(Kotlin,但基本原理相同) funmain(args:Array){ val executor=Schedulers.from(Executors.newCachedThreadPool()) 可观察 .fromIterable(1到1000) .观察者(执行者) .地图{ //第一街区 Thread.sleep((Math.random()*100.toLong()) Thread.currentThread().name+“-”+它 } .地图{ //第二街区 Thre
funmain(args:Array){
val executor=Schedulers.from(Executors.newCachedThreadPool())
可观察
.fromIterable(1到1000)
.观察者(执行者)
.地图{
//第一街区
Thread.sleep((Math.random()*100.toLong())
Thread.currentThread().name+“-”+它
}
.地图{
//第二街区
Thread.sleep((Math.random()*100.toLong())
它+“-”+UUID.randomUUID()
}
.订阅(
{
println(it)
},
{
it.printStackTrace()
},
{
执行器关闭()
}
)
}
我注意到:-
基本上,由于Rx链希望同步项目处理,看起来它使用相同的线程来处理所有项目。如果您的应用程序依赖于Rx,那么这种方法就无法达到多线程的目的。据说Rx对底层并发实现是不可知的。可能是我用错了吗?建议阅读:好的,我在上面。嘿,大卫,我确实读过很多次维基。我确信subscribeOn在这里不会有帮助,因为我的Obersable创建是非阻塞的。我想解决方案是使用flowable with parallel.RxJava在默认情况下是同步的,这意味着多个后续
map
s将在同一个线程上运行,它们不会并行处理不同的元素。您必须通过observeOn
引入并发,才能让每个阶段在不同的线程上运行。感谢@akarnokd一如既往:)
fun main(args: Array<String>) {
val executor = Schedulers.from(Executors.newCachedThreadPool())
Observable
.fromIterable(1 until 1000)
.observeOn(executor)
.map {
//1st block
Thread.sleep((Math.random() * 100).toLong())
Thread.currentThread().name + "-" + it
}
.map {
//2nd block
Thread.sleep((Math.random() * 100).toLong())
it + "-" + UUID.randomUUID()
}
.subscribe(
{
println(it)
},
{
it.printStackTrace()
},
{
executor.shutdown()
}
)
}