почему сопрограммы 1-го запускаются в потоке вызывающей стороны, но после первой точки приостановки они запускаются в DefaultExecutor в «Dispatchers.Unconfined»? - PullRequest
0 голосов
/ 14 февраля 2019

Ниже печатается код

import kotlinx.coroutines.*

    fun main() = runBlocking<Unit> {
        launch(Dispatchers.Unconfined) {
            // not confined -- will work with main thread
            println("thread ${Thread.currentThread().name}")
            delay(500)
            println("thread ${Thread.currentThread().name}")
        }
    }

1-й запуск на потоке вызывающего, но после первой точки приостановки он выполняется на DefaultExecutor в «Dispatchers.Unconfined»

 thread main
 thread kotlinx.coroutines.DefaultExecutor

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Диспетчер Unconfined не связан ни с одной нитью.Практически во всех случаях сопрограмма возобновляется в потоке, где пользователи вызывают continuation.resume().

В конкретном случае, который вы показываете, вы вызываете стандартную функцию delay, поэтому Kotlin должен внутренне обрабатывать как его приостановку, так и возобновление.Чтобы это произошло, он поддерживает запланированный пул потоков, в который он отправляет задачу возобновления, запланированную с указанной вами задержкой.

Диспетчер Unconfined полезен только в специализированных сценариях, где вы пишете свою собственную инфраструктуру.и хочу контролировать поток, где возобновляется сопрограмма.По сути, он закорачивает весь диспетчерский механизм.

0 голосов
/ 14 февраля 2019

Прочитайте описание Dispatchers.Unconfined, оно объясняет именно это поведение:

Диспетчер сопрограмм, который не ограничен каким-либо конкретным потоком.Он выполняет начальное продолжение сопрограммы непосредственно в текущем кадре вызова и позволяет сопрограмме возобновить работу в любом потоке, который используется соответствующей функцией приостановки, без указания какой-либо конкретной политики потоков. Примечание: используйте с особой осторожностью, не для общего кода .

...