kotlin: runblocking和GlobalScope.launch启动协程的区别
一,代码:
binding.button1.setOnClickListener {
//启动debug模式,可以打印协程的编号
System.setProperty("kotlinx.coroutines.debug", "on")
println("runBlocking外运行: ${Thread.currentThread().name}")
//runBlocking会启动一个协程
runBlocking {
println("runBlocking内运行: ${Thread.currentThread().name}")
repeat(3) {
launch {
println("runBlocking内launch runBlocking子协程: ${Thread.currentThread().name}")
}
}
delay(1000)
GlobalScope.launch {
println("GlobalScope.launch内运行: ${Thread.currentThread().name}")
repeat(3) {
launch {
println("GlobalScope.launch内launch GlobalScope子协程: ${Thread.currentThread().name}")
}
}
}.join()
}
}
区别在于: runBlocking启动的协程统一使用main线程
而GlobalScope.launch启动的协程使用了线程池,4个协程使用了3个线程
二,测试效果:
runBlocking外运行: main
runBlocking内运行: main @coroutine#1
runBlocking内launch runBlocking子协程: main @coroutine#2
runBlocking内launch runBlocking子协程: main @coroutine#3
runBlocking内launch runBlocking子协程: main @coroutine#4
GlobalScope.launch内运行: DefaultDispatcher-worker-1 @coroutine#5
GlobalScope.launch内launch GlobalScope子协程: DefaultDispatcher-worker-2 @coroutine#7
GlobalScope.launch内launch GlobalScope子协程: DefaultDispatcher-worker-3 @coroutine#6
GlobalScope.launch内launch GlobalScope子协程: DefaultDispatcher-worker-2 @coroutine#8