web-dev-qa-db-ja.com

コトリンでコルーチンの名前を取得する方法

メインスレッド上のsuspendedの場合、コルーチンの内部作業に興味があります。本当の質問は、メインスレッド上のコルーチンであるsuspended関数を記録する方法です。正確に実行が行われている場所はどこですか?それは仮想スレッドですか?

11
Sharan

コルーチンを作成する時点でCoroutineName(name:String)メソッドを使用してコルーチンに名前を付けることができます。

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

コルーチンに与えられた名前を回収するcoroutineContext[CoroutineName.Key]以下のように:

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

これはコンソールでO/Pの後に印刷されます。

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
 _
1
shivam