인프런 커뮤니티 질문&답변

이예진님의 프로필 이미지
이예진

작성한 질문수

2시간으로 끝내는 코루틴

Dispatchers 관련 궁금증입니다.

해결된 질문

작성

·

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가 동일하게 들어 있는 것을 확인하실 수 있습니다.

답변이 도움이 되었으면 좋겠습니다. 감사합니다! 🙏

이예진님의 프로필 이미지
이예진
질문자

빠른답변 감사합니다:)

이예진님의 프로필 이미지
이예진

작성한 질문수

질문하기