Почему имя потока меняется после объединения всех заданий в области сопрограмм? - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть этот код, который меня смущает. почему, если я использую 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()
}

1 Ответ

1 голос
/ 09 апреля 2019

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

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

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

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

...