1. 개요
Kotlin의 코루틴을 활용할 때, ThreadLocal
변수를 코루틴 컨텍스트에 통합하여 일관된 스레드 로컬 상태를 유지해야 할 때가 있습니다. 이와 같은 경우, ThreadLocal
의 asContextElement
확장 함수를 사용할 수 있습니다. 해당 함수는 ThreadLocal
을 ThreadContextElement
로 감싸주어, 코루틴이 실행되는 스레드가 변경되더라도 지정된 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. 주의사항
asContextElement
는ThreadLocal
의 값을 추적하지 않습니다.- 따라서 코루틴 내부에서
ThreadLocal
의 값을 변경하더라도, 해당 변경 사항은 반영되지 않습니다.
예제를 통해 이를 확인해보겠습니다.
myThreadLocal.set("main")
withContext(Dispatchers.Main) {
println(myThreadLocal.get()) // "main" 출력
myThreadLocal.set("UI") // 변경
}
println(myThreadLocal.get()) // "main" 출력 (변경 사항이 반영되지 않음)
4. withContext
를 활용한 값 변경
ThreadLocal
값을 변경하려면, withContext
와 asContextElement
를 함께 사용해야 합니다.
withContext(myThreadLocal.asContextElement("foo")) {
println(myThreadLocal.get()) // "foo" 출력
}
📌 원본 출처
본 문서의 예제와 내용은 Kotlin 공식 문서를 참고하여 작성되었습니다. 자세한 내용은 아래 공식 문서를 통해 확인할 수 있습니다.
'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 |