Tengo curiosidad sobre el funcionamiento interno de una rutina cuando está suspended en el hilo principal. La verdadera pregunta es cómo registrar una función suspended que es una rutina en el hilo principal. ¿Dónde se lleva a cabo exactamente la ejecución? ¿Es un hilo virtual?
Si está hablando de registrar el nombre de la rutina:
Puedes lograr esto por
Asigne un nombre a coroutine (si desea un nombre personalizado): launch(CoroutineName("My-Coroutine"))
Habilite el inicio de sesión en el menú de la barra de herramientas de IntelliJ: Ejecutar -> Editar configuración y agregar
-Dkotlinx.coroutines.debug en opciones de VM.
Luego puede ver @My-Coroutine en logcat.
Pruebe el siguiente código después de editar el cambio de configuración:
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()}Las otras respuestas no responden directamente a la pregunta " ¿Cómo obtener el nombre de una rutina en Kotlin? "; en cambio, sugieren cómo nombrar una rutina.
Si está dentro de una rutina, el nombre se puede recuperar usando currentCoroutineContext()[CoroutineName] .
Si está fuera de una rutina, no hay una forma directa de recuperar el nombre usando una referencia a un Job o Deferred (muy mal). Sin embargo, hay un truco de reflexión que se puede usar. Por supuesto, se adjuntan las advertencias habituales, que son, ningún tipo de seguridad y piratería en las API internas que pueden cambiar en cualquier momento.
@Suppress("UNCHECKED_CAST") val nameString = AbstractCoroutine::class.memberFunctions .single { it.name == "nameString" } as Function1<AbstractCoroutine<*>, String> val name = nameString(job as AbstractCoroutine<*>) .replace("\"", "") .takeWhile { it != '#' } El método/función que contiene este código debe marcarse con @InternalCoroutinesApi .
Puede dar un nombre a la rutina usando CoroutineName(name:String) al momento de crear la rutina:
repeat(5) { GlobalScope.launch(CoroutineName("$it")) { displayGreetingsFor(it) } } Para recuperar el nombre dado a coroutine, use coroutineContext[CoroutineName.Key] como se muestra a continuación:
private suspend fun displayGreetingsFor(i: Int) { delay(100) println( " ${coroutineContext[CoroutineName.Key]} is executing on thread : ${Thread.currentThread().name}" ) }Esto se imprimirá siguiendo o/p en la consola:
CoroutineName(0) is executing on thread : DefaultDispatcher-worker-3 CoroutineName(1) is executing on thread : DefaultDispatcher-worker-2 CoroutineName(2) is executing on thread : DefaultDispatcher-worker-8 CoroutineName(3) is executing on thread : DefaultDispatcher-worker-6 CoroutineName(4) is executing on thread : DefaultDispatcher-worker-5