Переключение потока в Kotlin
По умолчанию корутина может выполняться на потоке,
который её запустил. Для тяжелой или блокирующей
работы выбирают отдельный пул. Функция withContext
временно переключает корутину на указанный
Dispatcher и после блока возвращает
прежний контекст.
Диспетчер Dispatchers.Default рассчитан на вычисления
на нескольких ядрах. Имя текущего потока до и после
блока часто различается:
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
fun main() {
runBlocking {
println(Thread.currentThread().name)
withContext(Dispatchers.Default) {
println(Thread.currentThread().name)
}
println(Thread.currentThread().name)
}
}
Средняя строка обычно содержит имя потока из пула
Default. Первая и третья относятся к
потоку, на котором работал runBlocking.
Диспетчер Dispatchers.IO подходит для задач, где
много ожидания ввода-вывода. Участок внутри
withContext выполняется на потоке из
этого пула:
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withContext
fun main() {
runBlocking {
withContext(Dispatchers.IO) {
println("io thread")
}
println("back")
}
}
В runBlocking выведите имя потока,
затем в withContext с
Dispatchers.Default снова имя потока,
после блока - строку "home".
Внутри withContext на
Dispatchers.IO напечатайте
"disk". Сразу после выхода из блока
выведите "ui".