Подпись runBlocking
( do c) равна
fun <T> runBlocking(
context: CoroutineContext = EmptyCoroutineContext,
block: suspend CoroutineScope.() -> T
): T (source)
Если вы видите параметр context
, по умолчанию он имеет значение EmptyCoroutineContext
. Следовательно, если вы не передаете указанный c контекст, значением по умолчанию является событие l oop в текущем потоке. Поскольку текущий поток до запуска блока runBlocking
был основным потоком, все, что вы запускали внутри блока, все еще остается в основном потоке.
Если вы передадите контекст сопрограммы, как показано ниже, у вас будет блок внутри runBlocking
работает в другом потоке.
println("before runBlocking ${Thread.currentThread().name}")
runBlocking(Dispatchers.Default) {
delay(2000L)
println("inside runBlocking ${Thread.currentThread().name}")
delay(2000L)
}
println("after runBlocking ${Thread.currentThread().name}")
Вывод
before runBlocking main
inside runBlocking DefaultDispatcher-worker-1
after runBlocking main
Или, если вы запустите runBlocking
без передачи контекста, но запустите сопрограмму внутри, как показано ниже, вы бы увидеть, как он работает в другом потоке.
println("before runBlocking ${Thread.currentThread().name}")
runBlocking {
println("inside runBlocking ${Thread.currentThread().name}")
delay(2000L)
CoroutineScope(Dispatchers.Default).launch {
println("inside runBlocking coroutineScope ${Thread.currentThread().name}")
}
delay(2000L)
}
println("after runBlocking ${Thread.currentThread().name}")
Вывод
before runBlocking main
inside runBlocking main
inside runBlocking coroutineScope DefaultDispatcher-worker-1
after runBlocking main