我有这个 runBlocking 代码,我想知道它是否保证通过 runBlocking 启动的协程将始终在同一个线程上执行(即 runBlocking 开始执行的线程)?
第一个 println 将显示“线程 t1”。但是在执行挂起函数延迟后,我想知道这个协程是否会在同一个Thread t1中恢复,或者是否可以在不同的线程Thread t2上执行?这是因为协程可以在 2 个或更多线程上执行,因此 runBlocking 创建的协程可以在线程 t1 上执行,并在 delay() 上挂起并在不同的线程 t2 上恢复。
fun main(): Unit = runBlocking(Dispatchers.Default) { // Thread t1
println("runBlocking start: ${Thread.currentThread().name}") // Thread t1
delay(3000)
println("runBlocking end: ${Thread.currentThread().name}") // is it necessary to be t1 ?
}
我每次得到的输出是(但我觉得在输出的第二行中它也可能是 DefaultDispatcher-worker-2):--
运行阻塞启动:DefaultDispatcher-worker-1
runBlocking 结束:DefaultDispatcher-worker-1
Dispatchers.Default
这样的多线程调度程序。
尝试在内部启动一个或两个新的协程runBlocking
:
fun log(msg: String) = println("[${Thread.currentThread().name}] $msg")
fun main(): Unit = runBlocking(Dispatchers.Default) {
log("runBlocking start")
async { delay(50) }.await()
log("runBlocking end")
}
最终,将打印不同的线程:
[DefaultDispatcher-worker-1 @coroutine#1] runBlocking start
[DefaultDispatcher-worker-2 @coroutine#1] runBlocking end