在kotlin的协程中可以使用delay(time: Long)
方法来实现延迟执行,它内部是怎么实现的,和Thread.sleep()
有什么区别呢?
suspend fun test() {
println("1")
delay(1000)
println("2")
}
首先我们需要知道协程最终会将代码转换,感兴趣的话可以参考深入探索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方法直接阻塞当前线程。
内容