Я пытаюсь понять, как сопрограммы работают под капотом. У меня есть простой код, который приостанавливает выполнение сопрограммы и возобновляет ее в другом потоке.
fun main(){
fun pt(msg : String){
println("${Thread.currentThread().name}: ${msg}")
}
suspend fun a(){
pt("A")
suspendCoroutine { cont ->
thread (name = "new thread") {
pt("resuming")
cont.resume(Unit)
}
}
pt("B")
}
runBlocking {
a()
}
}
Поскольку сопрограмма возобновляется в new thread, я ожидал, что печать B также выполняется этим потоком, но, похоже, это не так.
main: A
new thread: resuming
main: B
Кто-нибудь может объяснить, что происходит? Является ли исходный поток, запустивший сопрограмму, частью объекта продолжения, и вызов resume передает ему выполнение?





Вы не возобновляете обсуждение в новой теме. Вы используете новый поток, чтобы что-то сделать (вывод «возобновление»), пока сопрограмма приостановлена, и дать команду сопрограмме возобновить работу. Затем эта нить завершается. Это не то, как вы могли бы заставить поток выполнять работу сопрограммы. Диспетчеры отвечают за назначение блоков работы сопрограмм потокам.