我有一段使我感到困惑的代码。为什么要在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()
}
答案 0 :(得分:1)
jobs.joinAll()
暂停执行,直到所有作业完成。这并不意味着当前线程处于等待状态。
协程的状态被保存,当前线程返回到线程池中。
所有作业完成后,协程将使用线程池中的任何可用线程继续执行。
这就是为什么您看到不同的ID。但是,取决于许多因素,行为可能会有所不同。例如,在我的计算机上运行代码始终会打印相同的ID。