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")去等待了。