科特琳协程切换规则?

时间:2019-11-19 02:31:47

标签: multithreading kotlin kotlin-coroutines

我想制作两个进程守护进程,例如aGroup和bGroup。 但是,当aGroup没有dealy时,bGroup从未启动 谁能告诉我为什么会这样?以及使协程程序永久运行的守护程序的最佳方法是什么。

谢谢

@Test
fun `test`() {
    runBlocking {

        val one = async(start = CoroutineStart.LAZY) {
            while (true) {
                runAGroup();
            }
        }.start()

        (1..10).forEach {

            async(start = CoroutineStart.LAZY) {

                while (true) {
                    runBGroup(it)
                }

            }.start()
        }
    }
}


suspend fun runAGroup() {
    println("[AGroup] Main")
    // delay(1000L)  <--- here
}

suspend fun runBGroup(name: Int) {
    println("[BGrouop] $name (1000L)")
    delay(1000L)

}

1 个答案:

答案 0 :(得分:1)

没有显式调度程序的

runBlocking使用事件循环在协程之间进行调度。由于您的runGroupA运行无间断,因此没有其他协程运行的机会。 如果您指定其他分派器,例如Dispatchers.Default,您还将看到其他协程也运行。

runBlocking(Dispatchers.Default) {
    val one = async(start = CoroutineStart.LAZY) {
        while (true) {
            runAGroup();
        }
    }.start()

    (1..10).forEach {

        async(start = CoroutineStart.LAZY) {

            while (true) {
                runBGroup(it)
            }

        }.start()
    }
}