kotlin 如何确定协同程序作业是否延迟

4xrmg8kj  于 2023-02-09  发布在  Kotlin
关注(0)|答案(1)|浏览(196)

有没有一种优雅的方法可以确定一个作业是否是当前艾德?
我需要重新启动作业,但仅当作业延迟时,如下所示

fun restart() {
    if (job?.isDelayed()) job?.cancel()
    else return
    job = launch {
        repeat(10) {
            //do some heavy work
            delay(5000)
        }
    }
}
icomxhvb

icomxhvb1#

从作业文档中可以找到答案,作业没有延迟状态,作业有 * 新建 活动 完成 取消 已取消 已完成 * 几种状态,作业提供的状态流也在这些状态中流动。
单从Job上似乎无法判断是否处于延迟状态,我们可以在类中单独设置delay标志,来改变delay函数调用前后的状态,以下是我的测试代码,希望能对大家有所帮助。

object Test {

     private val scope: CoroutineScope = CoroutineScope(Dispatchers.IO + SupervisorJob())

     private var job: Job? = null

     private var delayFlag = false

     fun startJob() {
         if (job?.isActive == true) return
         job = scope. launch {
             repeat(10) {
                 delayFlag = true
                 delay(5000)
                 delayFlag = false
             }
         }
     }

     fun restart() {
         if (job?.isActive == true && delayFlag) job?.cancel() else return
         println("restart job")
         job = scope. launch {
             repeat(10) {
                 //do some heavy work
                 delayFlag = true
                 delay(5000)
                 delayFlag = false
             }
         }
     }


}

fun main() = runBlocking {
     Test. startJob()
     repeat(5) {
         Test. restart()
         delay(20000L)
     }
}

相关问题