Как получить название сопрограммы в Котлине? - PullRequest
0 голосов
/ 23 января 2019

Мне интересно, какая внутренняя работа сопрограммы при suspended в основном потоке.Реальный вопрос заключается в том, как зарегистрировать функцию suspended, которая является сопрограммой в главном потоке.Где именно происходит казнь?Это виртуальный поток?

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

Если вы говорите о регистрации имени сопрограммы:

Вы можете достичь этого с помощью

  1. Дайте имя сопрограмме (если вы хотите произвольное имя): launch(CoroutineName("My-Coroutine"))

  2. Включить ведение журнала в меню панели инструментов IntelliJ: Выполнить -> Изменить конфигурацию и добавить

-Dkotlinx.coroutines.debug в настройках виртуальной машины.

VM Option in Edit Configuration

Тогда вы можете увидеть @My-Coroutine в logcat.

Попробуйте изменить код после изменения конфигурации:

fun main() = runBlocking {
println("   'runBlocking': I'm working in thread ${Thread.currentThread().name}")

val job = launch(CoroutineName("my-custom-name")) {
    println("   'runBlocking': I'm working in thread ${Thread.currentThread().name}")

}

job.join()}

Результат: Result

0 голосов
/ 23 января 2019

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

import kotlinx.coroutines.*

fun main() = runBlocking<Unit> {
    launch { // context of the parent, main runBlocking coroutine
        println("main runBlocking      : I'm working in thread ${Thread.currentThread().name}")
    }
    launch(Dispatchers.Unconfined) { // not confined -- will work with main thread
        println("Unconfined            : I'm working in thread ${Thread.currentThread().name}")
    }
    launch(Dispatchers.Default) { // will get dispatched to DefaultDispatcher 
        println("Default               : I'm working in thread ${Thread.currentThread().name}")
    }
    launch(newSingleThreadContext("MyOwnThread")) { // will get its own new thread
        println("newSingleThreadContext: I'm working in thread ${Thread.currentThread().name}")
    }    
}

напечатает это.

Unconfined            : I'm working in thread main
Default               : I'm working in thread DefaultDispatcher-worker-1
newSingleThreadContext: I'm working in thread MyOwnThread
main runBlocking      : I'm working in thread main

Подробнее здесь

...