Kotlin协程 — runBlocking的子协程霸占线程问题

探讨了在Kotlin中使用协程时,由于子协程的无限循环导致主线程被持续占用,使得其他代码无法执行的问题。通过具体代码示例,解释了runBlocking与launch的交互机制及线程抢占现象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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所使用的那一条线程来完成任务的,所以就会出现上述的线程被霸占的情况。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值