Kotlin协程执行顺序

311 阅读1分钟
runBlocking {
    launch {
        println("1")
    }
    launch(Dispatchers.Unconfined) {
        println("4")
    }
}
输出:
4
1

通过Dispatchers.Unconfined处理德代码相当于如下代码(忽略协程的创建)

runBlocking {
    launch {
        println("1")
    }
    println("4")
}
输出:
4
1

由于默认runBlocking()是一个单线程的ContinuationInterceptor,所以pringln("1")的代码要等待runBlocking()中Lambda方法执行完毕才能执行,由于println("4")直接会在Lambda中执行,所以打印顺序是4一定在1前面。

runBlocking {
    launch {
        println("1")
    }
    launch (Dispatchers.IO){
        println("2")
    }
    launch (Dispatchers.Default){
        println("3")
    }
    launch (Dispatchers.Unconfined){
        println("4")
    }
}
输出:
2
3
4
1

指定使用Dispatchers.IO和Dispatchers.Default不会在默认的BlockingEventLoop执行,Dispatchers.IO和Dispatchers.Default也是闲置的,不需要将任务加入到队列中,所以他们直接执行任务输出2341. println("1")被延后执行的原因是runBlocking默认ContinuationInterceptor只有一个线程来处理任务。所以如下也是一样的效果

runBlocking (Executors.newFixedThreadPool(1).asCoroutineDispatcher()){
    launch {
        println("1")
    }
    launch (Dispatchers.IO){
        println("2")
    }
    launch (Dispatchers.Default){
        println("3")
    }
    launch (Dispatchers.Unconfined){
        println("4")
    }
}
输出:
3
2
4
1

如果改为两个线程,就不一样了

runBlocking (Executors.newFixedThreadPool(2).asCoroutineDispatcher()){
    launch {
        println("1")
    }
    launch (Dispatchers.IO){
        println("2")
    }
    launch (Dispatchers.Default){
        println("3")
    }
    launch (Dispatchers.Unconfined){
        println("4")
    }
}
输出:
1
2
3
4

runBlocking有两个线程,则不需要println("1")去等待了。