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

 

posted @ 2025-07-19 07:47  刘宏缔的架构森林  阅读(21)  评论(0)    收藏  举报