对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回答

bennyhuo

2020-11-08

你把那个isDaemon改为false就好了。去搜一下幽灵线程你就明白了。

0
2
Da丶
后来我想了一下Handler机制那块,我记得Android常驻是因为主线程一直没停,然后我给main最下面加了一个while(true)终于明白一点了,原来这个叫幽灵线程
2020-11-08
共2条回复

Android首选开发语言Kotlin入门与进阶

Google I/O大会钦定Android一级开发语言,现在不学,等待何时

3122 学习 · 387 问题

查看课程