У меня есть следующий код:
import kotlinx.coroutines.*
fun main() = runBlocking {
launch {
println("in sub coroutine ${Thread.currentThread().name}")
}
println("before coroutine in main ${Thread.currentThread().name}")
withContext(Dispatchers.IO) {
println("hello from coroutine ${Thread.currentThread().name}")
delay(1500)
println("hello from coutoutine after delay ${Thread.currentThread().name}")
}
println("after coroutine in main ${Thread.currentThread().name}")
}
Вывод:
before coroutine in main main @coroutine#1
hello from coroutine DefaultDispatcher-worker-1 @coroutine#1
in sub coroutine main @coroutine#2
hello from coutoutine after delay DefaultDispatcher-worker-1 @coroutine#1
after coroutine in main main @coroutine#1
Насколько я понимаю, withContext
переключает код в новый контекст, где код выполняется в другой поток, и текущая сопрограмма приостанавливается до завершения кода в новом потоке. Но оригинальное определение ничего не говорит о создании новой сопрограммы.
Исходное определение из kotlin .github.io:
Вызывает указанную приостановку блок с заданным контекстом сопрограммы, приостанавливается до его завершения и возвращает результат.