我认为这两行等同于执行明智:
val context1 = Executors.newFixedThreadPool(2).asCoroutineDispatcher()
val context2 = newFixedThreadPoolContext(2, "Fixed")
但是,当我在下面的代码中使用“context2”时,它可以按预期工作,但是“context1”的作用类似于单个线程。
val context1 = Executors.newFixedThreadPool(2).asCoroutineDispatcher()
repeat(4) {
launch {
withContext(context1) {
Thread.sleep(2000)
}
}
}
context1.close()
预期的:2个线程将并行执行。该代码应在4秒钟内完成,因为要使2个线程休眠2秒钟,然后重复执行。
实际:仅执行一个线程,然后依次执行“重复”,这需要8秒钟才能完成。
这是一个错误吗?
或here找到的本文档是什么意思?
最佳答案
看完完整的代码示例后:
import kotlinx.coroutines.*
import java.util.concurrent.Executors
fun log(msg: String) = println("[${Thread.currentThread().name}] $msg")
fun main() = runBlocking {
val context1 = Executors.newFixedThreadPool(2).asCoroutineDispatcher()
val context2 = newFixedThreadPoolContext(2, "Fixed")
repeat(4) {
launch {
withContext(context1) {
log("Start sleep $it")
Thread.sleep(2000)
log("Finished sleep $it")
}
}
}
// context1.close()
}
我发现问题出在“context1.close()”上。如果我注释掉“context1.close()”,它将正常工作。我的猜测是“启动”调用没有阻塞,因此“context1.close()”要在其他线程上执行“withContext”之前执行。我本来以为会导致错误,但似乎只是使其成为一个线程。