Почему имя потока меняется после объединения всех заданий в области сопрограммы?

У меня есть код, который сбивает меня с толку. почему, если я использую CoroutineScope (Dispatchers.IO) .launch в runBlocking и проверяю его с помощью println (). Каждый раз, когда я проверяю это

println("01 Runblocking Scope Before join() => THis is ${Thread.currentThread().name} and ID is ${Thread.currentThread().id}")

будет отличаться от

println("02 Runblocking Scope Before join() => THis is ${Thread.currentThread().name} and ID is ${Thread.currentThread().id}")

Это мой код.

Но если я перейду с CoroutineScope (Dispatchers.IO) .launch {} на this.launch {}, println () в предыдущей строке будет таким же. Я думаю, что потому, что относятся к той же области (runBlocking {}), но почему, если я использую CoroutineScope (Dispatchers.IO) .launch {}, то println () не печатает одни и те же данные.

runBlocking {
    println("Outside Scope => THis is ${Thread.currentThread().name} and ID is ${Thread.currentThread().id}")
    CoroutineScope(Dispatchers.IO).launch {
    //this.launch {
    println("Runblocking Scope => THis is ${Thread.currentThread().name} and ID is ${Thread.currentThread().id}")
        val jobs = mutableListOf<Job>()
        for( i in IntRange(0, 10)) {
            jobs.add(CoroutineScope(Dispatchers.IO).launch {
                printData(i)
            })
        }
        println("01 Runblocking Scope Before join() => THis is ${Thread.currentThread().name} and ID is ${Thread.currentThread().id}")

        jobs.joinAll()

        println("02 Runblocking Scope Before join() => THis is ${Thread.currentThread().name} and ID is ${Thread.currentThread().id}")
        println("Exit Runblocking Scope")
    }.join()
}

person Hello World    schedule 09.04.2019    source источник


Ответы (1)


jobs.joinAll() приостанавливает выполнение до завершения всех заданий. Это не означает, что текущий поток находится в режиме ожидания.

Состояние сопрограммы сохраняется, и текущий поток возвращается в пул потоков.

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

Вот почему вы видите разные идентификаторы. Тем не менее, поведение может быть разным в зависимости от многих факторов. Например, запуск вашего кода на моем компьютере всегда печатает одни и те же идентификаторы.

person Alexander Egger    schedule 09.04.2019
comment
Спасибо, сэр, вы дали мне понять, что я путаю. :) - person Hello World; 09.04.2019