为什么在协程范围内加入所有作业后线程名称会更改?

时间:2019-04-09 03:26:23

标签: multithreading kotlin coroutine kotlin-coroutines

我有一段使我感到困惑的代码。为什么要在runBlocking中使用CoroutineScope(Dispatchers.IO).launch并使用println()进行检查?每次我测试它

println("01 Runblocking Scope Before join() => THis is ${Thread.currentThread().name} and ID is ${Thread.currentThread().id}")

将与

不同
println("02 Runblocking Scope Before join() => THis is ${Thread.currentThread().name} and ID is ${Thread.currentThread().id}")

这是我的代码。

但是,如果我从CoroutineScope(Dispatchers.IO).launch {}更改为this.launch {},则先前行中的两个println()都将相同。我认为这是因为引用相同的作用域(runBlocking {}),但是为什么要使用CoroutineScope(Dispatchers.IO).launch {},这些println()不会打印相同的数据。

runBlocking {
    println("Outside Scope => THis is ${Thread.currentThread().name} and ID is ${Thread.currentThread().id}")
    CoroutineScope(Dispatchers.IO).launch {
    //this.launch {
    println("Runblocking Scope => THis is ${Thread.currentThread().name} and ID is ${Thread.currentThread().id}")
        val jobs = mutableListOf<Job>()
        for( i in IntRange(0, 10)) {
            jobs.add(CoroutineScope(Dispatchers.IO).launch {
                printData(i)
            })
        }
        println("01 Runblocking Scope Before join() => THis is ${Thread.currentThread().name} and ID is ${Thread.currentThread().id}")

        jobs.joinAll()

        println("02 Runblocking Scope Before join() => THis is ${Thread.currentThread().name} and ID is ${Thread.currentThread().id}")
        println("Exit Runblocking Scope")
    }.join()
}

1 个答案:

答案 0 :(得分:1)

jobs.joinAll()暂停执行,直到所有作业完成。这并不意味着当前线程处于等待状态。

协程的状态被保存,当前线程返回到线程池中。

所有作业完成后,协程将使用线程池中的任何可用线程继续执行。

这就是为什么您看到不同的ID。但是,取决于许多因素,行为可能会有所不同。例如,在我的计算机上运行代码始终会打印相同的ID。