fun main() = runBlocking {
launch {
var nextTime = System.currentTimeMillis()
while (true) {
val currentTime = System.currentTimeMillis()
if (currentTime > nextTime) {
println("当前时间${System.currentTimeMillis()}")
nextTime += 1000
}
}
}
delay(2000)
println("这里的代码无法得到执行")
println("这里的代码无法得到执行")
}
运行结果:
当前时间1562152214046
当前时间1562152215038
当前时间1562152216038
........
运行上面的代码后不会输出其他的结果,只会重复上面的时间输出, 这是因为launch开启的子协程中的while循环一直在不停歇的没有任何挂起操作的在执行代码,导致了线程一直被占用而无法处理顶层协程中的代码了。因为runBlocking中调用launch()会在当前线程中执行协程,也就是说在runBlocking中不管开启多少个子协程它们都是使用runBlocking所使用的那一条线程来完成任务的,所以就会出现上述的线程被霸占的情况。