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