我认为这两行等同于执行明智:

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”之前执行。我本来以为会导致错误,但似乎只是使其成为一个线程。

10-04 14:50