runBlocking 中有两个以上的等待
More than two awaits in runBlocking
我在 Kotlin 中遇到 await 问题,如果我只使用 2 await
s,这个 runBlocking
块可以工作 10 秒,但是当我尝试使用 4 await
s,它的工作时间为 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
}
}
使用 async { ... }
时,您让标准库为 运行 您的协程选择一个默认上下文。我想在您的情况下,它恰好是一个只有两个线程的线程池。
要控制发生的事情,请使用
async(MyDispatcher) { ... }
其中,作为一个简单的例子,您可以定义
val MyDispatcher = Executors.newFixedThreadPool(4).asCoroutineDispatcher()
请记住,关闭线程池现在是您的责任:
MyDispatcher.close()
我在 Kotlin 中遇到 await 问题,如果我只使用 2 await
s,这个 runBlocking
块可以工作 10 秒,但是当我尝试使用 4 await
s,它的工作时间为 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
}
}
使用 async { ... }
时,您让标准库为 运行 您的协程选择一个默认上下文。我想在您的情况下,它恰好是一个只有两个线程的线程池。
要控制发生的事情,请使用
async(MyDispatcher) { ... }
其中,作为一个简单的例子,您可以定义
val MyDispatcher = Executors.newFixedThreadPool(4).asCoroutineDispatcher()
请记住,关闭线程池现在是您的责任:
MyDispatcher.close()