8

我在 Kotlin 中的 await 有问题,如果我只使用 2await秒,这个runBlocking块可以工作 10 秒,但是当我尝试使用 4await秒时,它可以工作 20 秒。据我了解,runBlocking 中只有两个异步线程。我怎样才能增加这个计数?

fun testFun() {
    val z1 = async { Thread.sleep(10000) }
    val z2 = async { Thread.sleep(10000) }
    val z3 = async { Thread.sleep(10000) }
    val z4 = async { Thread.sleep(10000) }

    runBlocking {
        z1.await()
        z2.await()
        z3.await()
        z4.await() // works 20 seconds
    }
}
4

1 回答 1

5

随着async { ... }你让标准库选择一个默认上下文来运行你的协程。我猜在你的情况下它恰好是一个只有两个线程的线程池。

要控制发生的事情,请使用

async(MyDispatcher) { ... }

作为一个简单的例子,你可以定义

val MyDispatcher = Executors.newFixedThreadPool(4).asCoroutineDispatcher()

请记住,关闭线程池现在是您的责任:

MyDispatcher.close()
于 2018-03-01T12:27:18.077 回答