1

我将使用线程执行器与 rxkotlin 做一些后台工作,我将线程池大小固定为 3,但我的问题是在我的后台操作期间它只使用 3 个线程中的一个,这会减慢我的后台操作

执行者类

 class ThreadExe : Executor{

     companion object {
        private const val THREAD_POOL_SIZE = 3
    }

    private val executor: Executor = 
       Executors.newFixedThreadPool(THREAD_POOL_SIZE)

    override fun execute(runnable: Runnable) {
          executor.execute(runnable)
    }

}

以上是我负责创建线程的执行器类。
我将调用我的后台任务,如下所示

 getSomeDataFromNetworkProcessWithDB()
    .subscribeOn(Schedulers.from(ThreadExe()))
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe()

fun getSomeDataFromNetworkProcessWithDB() {
    Observable.fromIteratable(someDataList())
            .flatMap {
                getSomeNetworkData()
            }
            .flatMap {
                doSomeDbOperation()
            }
}

我对上面代码的问题是所有这些网络和数据库操作都在同一个线程上按顺序工作,因为我们给了大小为 3 的线程池,它必须并行发送 3 个网络请求,但请求是按顺序进行的
谁能帮帮我这个问题 ?

4

1 回答 1

1

如果您希望单个操作在不同的线程上运行,请尝试以下操作:

    getSomeDataFromNetworkProcessWithDB(Schedulers.from(ThreadExe()))
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe()
fun getSomeDataFromNetworkProcessWithDB(scheduler: Scheduler): Observable<Data> {
    return Observable.fromIterable(someDataList())
            .flatMap {
                getSomeNetworkData().subscribeOn(scheduler)
            }
            .flatMap {
                doSomeDbOperation().subscribeOn(scheduler)
            }
            .subscribeOn(scheduler) // optional, if you want fromIterable(), someDataList() to run on this scheduler.
}
于 2019-06-03T18:17:11.693 回答