Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

413
Visualizações
How to get the name of a coroutine in Kotlin?

I'm curious about the internal working of a coroutine when suspended on the main thread. The real question is how to log a suspended function which is a coroutine on the main thread. Where exactly the execution is taking place? Is it a virtual thread?

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

If you are talking about logging the coroutine name:

You can achieve this by

  1. Give name to coroutine(if you want custom name): launch(CoroutineName("My-Coroutine"))

  2. Enable the logging in IntelliJ toolbar menu: Run -> Edit Configuration and add

-Dkotlinx.coroutines.debug in VM options.

VM Option in Edit Configuration

Then you can see @My-Coroutine in logcat.

Try below code after Edit Configuration change:

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: Result

over 4 years ago · Santiago Trujillo Relatório

0

The other answers don't answer the question directly "How to get the name of a coroutine in Kotlin?"; instead, they suggest how to name a coroutine.

If inside a coroutine, the name can be retrieved using currentCoroutineContext()[CoroutineName].

If outside a coroutine, there's no direct way to retrieve the name using a reference to a Job or Deferred (too bad). However, there's a reflection hack that can be used. Of course, the usual warnings come attached, which are, no type safety and hacking into internal APIs that may change anytime.

@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 != '#' }

The method/function containing this code has to be marked with @InternalCoroutinesApi.

over 4 years ago · Santiago Trujillo Relatório

0

You can give name to coroutine using CoroutineName(name:String) method at the time of creating coroutine:

repeat(5) {
            GlobalScope.launch(CoroutineName("$it")) {
                displayGreetingsFor(it)
            }
        }

To retrive the name given to coroutine use coroutineContext[CoroutineName.Key] as shown below:

private suspend fun displayGreetingsFor(i: Int) {
        delay(100)
        println(
            " ${coroutineContext[CoroutineName.Key]} is executing on thread : ${Thread.currentThread().name}"
        )
    }

This is will print following o/p on console:

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
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda