임헌준님 안녕하세요. 지식공유자 조세영입니다. CoroutineDispatcher가 코루틴을 스레드로 보내 실행시키는 역할을 위한 객체가 맞습니다. singleThreadDispatcher와 multiThreadDispatcher는 CoroutineDispatcher를 만들어내지만, 이 함수들은 생성한 CoroutineDispatcher가 코루틴을 보낼 수 있는 전용 스레드풀을 만드는 역할도 합니다. 분리해서 생각을 해야 할 것 같아요. Dispatchers.IO나 Dispathcers.Default는 무제한 스레드풀에서 생성된 스레드에 코루틴을 보내고, singleThreadDispatcher나 multiThreadDispatcher로 만들어진 CoroutineDispatcher는 전용 스레드풀에 코루틴을 보내는 역할을 합니다. 즉, CoroutineDispatcher 자체는 "코루틴을 어느 실행 컨텍스트에서 돌릴지 결정하는 역할"을 하고, 어떤 Dispatcher를 사용하느냐에 따라 전용 스레드 풀을 쓸지, 공유 스레드 풀을 쓸지가 달라집니다. 답변이 도움이 되면 좋을 것 같습니다. 감사합니다.
mamu님 안녕하세요. 강의가 도움이 돼서 기쁘네요! 날카로운 질문 주신거 같아요. 분명 메인스레드에서의 동작이 남아있는데 종료되는 것이 이상하게 느껴지셨을 수 있습니다. 질문 주신 부분을 이해하시려면 코루틴의 내부 동작을 이해해야 합니다. 결국 코루틴은 내부적으로는 콜백을 사용해 비동기를 구현합니다. (Continuation을 기반으로 동작하게 돼 있습니다.) 따라서 메인 함수가 반환돼 버리면 콜백이 일어나지 못하고 종료되는 것입니다. 답변이 도움이 되었으면 좋겠습니다. 감사합니다.
mamu님 안녕하세요. 지식공유자 조세영입니다. 첫번째 코드의 경우 Job의 parent 인자로 넘기신 Job이 runBlocking 코루틴의 자식 코루틴의 Job입니다. 따라서 runBlocking 코루틴은 해당 Job이 완료되기까지 완료 중 상태에 머뭅니다. 하지만 두 번째 코드의 경우 Job이 parent 없이 생성되고 있습니다. 즉, 기존 runBlocking 의 Job과의 구조화가 깨지기 때문에 runBlocking 코루틴이 해당 Job을 기다리지 않고 완료됩니다. 즉, 해당 Job은 완료되지 않지만 runBlocking 코루틴이 완료돼 프로세스가 종료되는 것입니다. 답변이 도움이 되면 좋을 것 같습니다. 감사합니다.
dkdiehdbcjsk jehdb님 안녕하세요. 해당 경우는 launch 코루틴이 메인스레드를 점유 후 양보하지 않기 때문입니다. runBlocking 코루틴에서 cancel이 실행돼야하는데 계속 대기 상태에 머물러서 그렇습니다. 이에 관한 자세한 내용은 이후 강의에서 다루는 코루틴의 양보와 관련된 내용에서 배우실 수 있습니다.
denia park님 안녕하세요. 이 이벤트는 연말, 연초에 강의를 구매하신 분들을 위해 준비되어서 부득이하게 기간 제한을 두게 되었습니다. 구매 해주신 날짜가 2024.12.19~2025.1.18 사이이신 분들이 대상인점 양해 부탁드립니다. 다만, 이전 질문과 함께 날짜 오류도 리포트 해주셔서 너무 감사해서요. seyoungcho2@gmail.com 으로 연락처를 보내주시면 소정의 연말 선물을 보내드릴 수 있도록 하겠습니다. 강의를 열심히 들어주셔서 감사합니다!