Kotlin中launch与launch(Dispatchers.Default)的执行差异疑问
协程调度器差异的原因解析
你遇到的核心问题是runBlocking的默认协程上下文并非Dispatchers.Default,而是一个绑定到当前调用线程的专用单线程上下文,这直接导致了两种launch行为的差异:
无参数的
launch会继承当前协程(也就是runBlocking)的上下文,这个上下文的调度器是BlockingEventLoop,它完全依赖当前线程来执行协程任务。当你调用Thread.sleep时,当前线程被阻塞,事件队列里的launch任务根本没机会执行,必须等sleep结束、线程空闲后才会被调度。而指定
Dispatchers.Default的launch,会使用Kotlin协程提供的后台线程池调度器。这个调度器会把协程任务提交到独立的线程池线程中执行,完全不受当前线程的阻塞影响,所以能立刻启动输出内容。
举个直观的代码示例验证这个逻辑:
fun main() = runBlocking { launch { println("无调度器的launch执行") } launch(Dispatchers.Default) { println("指定Default的launch执行") } Thread.sleep(1000) println("sleep完成") }
执行后输出顺序是:
指定Default的launch执行
sleep完成
无调度器的launch执行
简单总结:launch的默认调度器是继承自父协程上下文,而runBlocking为了实现"阻塞当前线程直到协程完成"的特性,使用了自己的单线程上下文,而非通用的Dispatchers.Default。
内容的提问来源于stack exchange,提问作者lager_virtual_machine
相关产品推荐
相关产品推荐

