Kotlin协程中的delay内部是如何实现的?

在kotlin的协程中可以使用delay(time: Long)方法来实现延迟执行,它内部是怎么实现的,和Thread.sleep()有什么区别呢?

suspend fun test() {
    println("1")
    delay(1000)
    println("2")
}
kotlin协程delaycoroutinessleep
1
406
已修改
小课
小课2022-05-21 16:59
1 个回答

首先我们需要知道协程最终会将代码转换,感兴趣的话可以参考深入探索suspend关键字,比如说下面这段代码。

suspend fun test() {
    println("1")
    myPrint2()
    println("3")
}

suspend fun myPrint2() = withContext(Dispatchers.IO) {
    println("2")
}

最终转化后代码大概效果如下,在主线程执行完println("1")后,然后在IO线程中执行println("2"),最后再返回主线程执行println("3")

runOnMainThread {
    println("1")
    runOnIOThread {
        println("2")
        runOnMainThread {
            println("3")
        }
    }
}

delay方法内部的逻辑同样也可以是在其它线程执行,于是提问中的代码转化后效果如下,它可以在其它线程中等待1s后再执行后续的逻辑。

runOnMainThread {
    println("1")
    runOnIOThread {
        LockSupport.parkNanos(1000 * 000000)
        //让IO线程休眠1s,然后再继续执行
        runOnMainThread {
            println("2")
        }
    }
}

当然kotlin的delay方法内部的实现并没有这么简单,因为它做了很多优化,但是最简单的实现大概是这样。从上面也可以看出delay方法不会阻塞当前线程,只是会延后执行delay后面的代码,而Thread.sleep方法直接阻塞当前线程

1
已修改
小课
小课2022-05-21 22:20
你的回答

内容