Creating our own coroutineContext

참치돌고래·2022년 12월 1일
0
post-custom-banner

CoroutineContext.Element 인터페이스를 상속받아 customContext를 생성해보자.
각 element에 접근할 수 있는 Key를 companion object를 통해 구현하자.


class MyCustomContext : CoroutineContext.Element{
    override val key: CoroutineContext.Key<*>
        = Key
    companion object Key :
            CoroutineContext.Key<MyCustomContext>
}

대략적으로 context를 위에 예와 같이 만들 수 있다.
이러한 형식을 가지고 main 에서 parent 와 child 형식을 취하는 coroutineContext를 생성해 보자.


class CounterContext(
    private val name: String
) : CoroutineContext.Element {
    override val key: CoroutineContext.Key<*> = Key
    private var nextNum = 0

    fun printNext() {
        println("$name : $nextNum")
        nextNum++
    }

    companion object Key :
        CoroutineContext.Key<CounterContext>
}
    suspend fun printNext() {
        coroutineContext[CounterContext]?.printNext()
    }

suspend fun main() : Unit =
    withContext(CounterContext("Outer")) {
        printNext()
        launch {
            printNext()
            launch {
                printNext()
            }
            launch (CounterContext("Inner"))  {
                printNext()
                printNext()
                launch {
                    printNext()
                }
            }
        }
    printNext()
}

output

Outer : 0
Outer : 1
Outer : 2
Outer : 3
Inner : 0
Inner : 1
Inner : 2
profile
안녕하세요
post-custom-banner

0개의 댓글