TLDR;
Нет гарантии, может или нет, это действительно зависит от следующих моментов:
- Является ли диспетчер многопоточным?
- Есть ли какое-либо переопределение диспетчера между ними?
ДЛИННЫЙ ответ
У сопрограммы есть CoroutineContext, который указывает, как он ведет себя, где он работает.
CoroutineContext в основном состоит из четырех элементов: Job
, CoroutineName
, CoroutineExceptionHandler
и Dispatcher
.
Ответственность диспетчера за отправку сопрограммы. Диспетчер может быть приостановлен, чтобы остановить даже выполнение сопрограмм (это полезно при модульном тестировании) , упомянутый здесь в android конференции , это может быть однопоточный диспетчер, такой же как Dispatchers.Main
, это имеет событие-l oop, как javascript has.
Итак, это действительно зависит от следующих моментов:
- Является ли диспетчер многопоточным?
Например: это будет работать в одном потоке.
suspend fun main() {
val dispatcherScope = CoroutineScope(Executors.newSingleThreadExecutor().asCoroutineDispatcher())
val job = dispatcherScope.launch {
repeat(10) {
launch {
println("I'm working in thread ${Thread.currentThread().name}")
// every coroutine on same thread
}
}
}
job.join()
}
Запустите его здесь , другие однопоточные диспетчеры: Dispatchers.Main
Есть ли какое-либо переопределение диспетчера между ними?
В том же контексте, если мы переопределим диспетчер перед запуском, он изменит поток, даже если исходный контекст основан на однопоточном событии. l oop, каждая сопрограмма будет выполняться в отдельном потоке, создавая 10 различных потоков:
dispatcherScope.launch {
repeat(10) {
launch(Dispatchers.IO) {
println("I'm working in thread ${Thread.currentThread().name}")
// every coroutine on same thread
}
}
}
Запустите его здесь , другие многопоточные диспетчеры: Dispatchers.Default, диспетчер на основе исполнителя, Dispatchers.Unconfined (это сопрограмма запуска в любой бесплатной теме).