我开始学习kotlin协程。但我正面临着这样的情况。
fun main(){
println("${Thread.currentThread().name} thread started")
GlobalScope.launch {
println("${Thread.currentThread().name} thread started")
Thread.sleep(1000)
println("${Thread.currentThread().name} thread finished")
}
GlobalScope.launch {
println("${Thread.currentThread().name} thread started")
delay(1000)
println("${Thread.currentThread().name} thread finished")
}
GlobalScope.launch {
println("${Thread.currentThread().name} thread started")
delay(1000)
println("${Thread.currentThread().name} thread finished")
}
runBlocking {
delay(1000)
}
println("${Thread.currentThread().name} thread finished")
}
代码的输出:
main thread started
DefaultDispatcher-worker-1 thread started
DefaultDispatcher-worker-2 thread started
DefaultDispatcher-worker-3 thread started
DefaultDispatcher-worker-1 thread finished
DefaultDispatcher-worker-1 thread finished
DefaultDispatcher-worker-2 thread finished
main thread finished
为什么"DefaultDispatcher-worker-1线程已完成";运行了2次。我想这只是线程的名称在改变,但我想知道为什么?
协程不保证整个协程在整个持续时间内都在同一个线程上运行。线程管理由您使用的调度程序处理。调度程序。Default使用线程池,每次从挂起恢复时都可以交换线程,就像每次调用delay()
之后一样。这是预期的行为,因为它可以减少派生线程对象的总数。