해결된 질문
작성
·
156
1
withContext(Dispatchers.IO) {
println(“AA : ${Thread.currentThread().name}")
val asyncOrigin = async {
println(“BB : ${Thread.currentThread().name}")
origin.invoke()
}
}
// 결과
AA : DefaultDispatcher-worker-1 @coroutine#2
BB : DefaultDispatcher-worker-3 @coroutine#3
안녕하세요.
Dispatchers 사용부분이 궁급함니다.
따로 asyncOrigin에서 Dispatchers를 다르게 쓰겠다고 설정한게 없는데 결과가 의문이였습니다.
물론 코루틴은 각자 실행이여서 코루틴의 번호가 다른건 이해했습니다만,
부모꺼의 스레드를 가져다 쓸거다라고 생각했는데 스레드도 부모꺼를 안쓰고 다른게 맞는걸까요?
어떤 원리인지 궁금합니다.
답변 1
0
안녕하세요 예진님! 😊 질문 주셔서 감사합니다.
결론부터 빠르게 말씀드려보면, 부모 코루틴의 Dispatcher를 동일하게 사용한 것이 맞습니다!
작성해주신 코드에서
withContext(Dispatchers.IO) {
println(“AA : ${Thread.currentThread().name}")
val asyncOrigin = async {
println(“BB : ${Thread.currentThread().name}")
origin.invoke()
}
}
withContext
를 통해 Dispatcher를 Dispatchers.IO
를 사용하도록 변경한 후, async
를 통해 코루틴을 만들게 되면, async
안도 마찬가지로 Dispatchers.IO
를 사용하는데요!
Dispatchers.IO
자체가 일종의 스레드풀이기 때문에 한 스레드만 있지 않고, 이름이 다른 스레드에 배정되어 println()
이 실행된거라고 봐주시면 될 것 같아요!
DefaultDispatcher-worker-xx
에서 스레드 번호에 따라 xx만 다른 형태죠!! 😊
실제로 println(coroutineContext)
를 찍어보시면, 내부에 Dispatchers.IO
가 동일하게 들어 있는 것을 확인하실 수 있습니다.
답변이 도움이 되었으면 좋겠습니다. 감사합니다! 🙏
빠른답변 감사합니다:)