对delay()函数的疑问
来源:7-2 协程入门

Da丶
2020-11-08
最近在看老师的书,看到第五章对协程基础设施的封装这里,按照Delay的实现方式
val executor = Executors.newScheduledThreadPool(1) { runnable ->
Thread(runnable, "Scheduler").apply { isDaemon = true }
}
//延时函数
suspend fun delay(time: Long, unit: TimeUnit = TimeUnit.MILLISECONDS) {
if (time <= 0) return
suspendCoroutine<Unit> { con ->
executor.schedule({
con.resume(Unit)
}, time, unit)
}
}
我写完做了一个尝试:
fun main() {
suspend {
println("1")
delay(1000L)
println("2")
}.startCoroutine(object : Continuation<Unit> {
override val context: CoroutineContext
get() = EmptyCoroutineContext
override fun resumeWith(result: Result<Unit>) {
println("3")
}
})
}
结果:
1
Process finished with exit code 0
这里奇怪的是,和预期的输出结果并不一样。
预想的输入结果是:1,2,3
问题:
(1)使用自己编写的Delay方法,为什么会阻断输出,我打断点发现,线程池的常驻线程根本没执行,但是具体原因还是不太明白。
(2)然后我尝试了把自己写的Delay()方法,换成Kotlin基础库中自带的delay()发现结果也是一样的,所以我觉得我对于这块应该有个盲区。
(3)按道理Delay()相当于让协程在某个时间点挂起,根据设置的时间,然后恢复,但是出现这个结果。。。。
写回答
1回答
-
你把那个isDaemon改为false就好了。去搜一下幽灵线程你就明白了。
022020-11-08
相似问题