본문 바로가기

Kotlin/kotlinx.coroutines

asContextElement

1. 개요

Kotlin의 코루틴을 활용할 때, ThreadLocal 변수를 코루틴 컨텍스트에 통합하여 일관된 스레드 로컬 상태를 유지해야 할 때가 있습니다. 이와 같은 경우, ThreadLocalasContextElement 확장 함수를 사용할 수 있습니다. 해당 함수는 ThreadLocalThreadContextElement로 감싸주어, 코루틴이 실행되는 스레드가 변경되더라도 지정된 ThreadLocal 값이 유지될 수 있도록 합니다.


2. 사용법

다음은 asContextElement를 활용하는 기본적인 예제입니다.

import kotlinx.coroutines.*
import kotlinx.coroutines.asContextElement

val myThreadLocal = ThreadLocal<String?>()

fun main() = runBlocking {
    println(myThreadLocal.get()) // "null" 출력

    launch(Dispatchers.Default + myThreadLocal.asContextElement(value = "foo")) {
        println(myThreadLocal.get()) // "foo" 출력
        withContext(Dispatchers.Main) {
            println(myThreadLocal.get()) // "foo" 출력 (UI 스레드에서도 동일)
        }
    }

    println(myThreadLocal.get()) // "null" 출력
}

위 예제에서 myThreadLocal은 코루틴 컨텍스트에 추가되어, 코루틴이 실행되는 동안 어떤 스레드에서 실행되더라도 ThreadLocal 값이 "foo"로 유지됩니다.


3. 주의사항

  • asContextElementThreadLocal의 값을 추적하지 않습니다.
  • 따라서 코루틴 내부에서 ThreadLocal의 값을 변경하더라도, 해당 변경 사항은 반영되지 않습니다.

예제를 통해 이를 확인해보겠습니다.

myThreadLocal.set("main")

withContext(Dispatchers.Main) {
    println(myThreadLocal.get()) // "main" 출력
    myThreadLocal.set("UI") // 변경
}

println(myThreadLocal.get()) // "main" 출력 (변경 사항이 반영되지 않음)

4. withContext를 활용한 값 변경

ThreadLocal 값을 변경하려면, withContextasContextElement를 함께 사용해야 합니다.

withContext(myThreadLocal.asContextElement("foo")) {
    println(myThreadLocal.get()) // "foo" 출력
}

📌 원본 출처

본 문서의 예제와 내용은 Kotlin 공식 문서를 참고하여 작성되었습니다. 자세한 내용은 아래 공식 문서를 통해 확인할 수 있습니다.

🔗 Kotlin Coroutines 공식 문서 - asContextElement

'Kotlin > kotlinx.coroutines' 카테고리의 다른 글

cancel  (0) 2025.02.07
awaitCanellation  (0) 2025.02.07
awaitAll  (0) 2025.02.07
await  (0) 2025.02.07
async  (0) 2025.02.06