Multithreading RxJava:理解并发执行

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

在我下面的例子中(Kotlin,但基本原理相同)

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()
                }
            )
    }