为何flowOn配置后map与collect均运行在后台线程?
为什么flowOn后collect也在后台线程执行?
问题出在你对flowOn的作用范围和协程调度器默认行为的理解上,拆解说明如下:
flowOn仅作用于上游操作
flowOn(Dispatchers.IO)的功能是让它之前的所有上游操作(也就是map和flowOf)切换到IO线程池执行,这部分你的理解是对的——输出里的DefaultDispatcher-worker-2就是上游操作的线程。但它不会影响flowOn之后的下游操作,collect的执行线程完全由调用它的协程上下文决定。默认launch用后台调度器
你代码里的launch没有指定任何调度器,在非Android的main函数场景下,Kotlin协程默认会使用Dispatchers.Default调度器,它运行在后台线程池里。所以collect作为launch协程内的代码,自然就跑到后台线程(DefaultDispatcher-worker-1)去了,并非你以为的主线程。让collect跑主线程的方法
如果想让collect在主线程执行,需要给launch显式指定Dispatchers.Main调度器。注意,在非Android环境(比如普通Java/Kotlin程序)里,需要先引入对应平台的Main调度器依赖(比如kotlinx-coroutines-swing),否则会报错。修改后的代码示例:
coroutineScope { launch(Dispatchers.Main) { // 显式指定主线程调度器 flowOf(1, 2, 3) .map { println(Thread.currentThread().name) it * 2 } .flowOn(Dispatchers.IO) .collect { println(Thread.currentThread().name) println("Number: $it") } } }
内容的提问来源于stack exchange,提问作者ant2009
相关产品推荐
相关产品推荐

