해결된 질문
작성
·
27
1
- 학습 관련 질문을 남겨주세요. 질문을 상세히 작성하면 더 좋습니다.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
안녕하세요.
Job() 생성시에 어떤 경우는 compete을 호출해 주어야 하고 어떤 경우는 아닌 것 같은데 그 상황이 헷깔려서 문의 드립니다.
강의에서는 다음과 같이 설명 합니다.
launch나 async 함수를 통해 생성한 job객체는 모든 코드가 실행 되면 자동 완료 되지만 job 생성 함수를 통해 생성한 job 객체는 자동으로 실행 완료 되지 않습니다.
아래 코드에서는 launch 안에서 생성함수를 통해 생성한 job 객체는 자동 완료 되지 않는 것으로 보입니다.
fun main() = runBlocking<Unit> {
launch(CoroutineName("Coroutine1")) {
launch(CoroutineName("Coroutine2") + Job(parent = this.coroutineContext[Job])) {
delay(100L)
println("[${Thread.currentThread().name}] 코루틴 실행")
}
}
}
하지만 아래 코드에서는 똑같이 생성함수를 통해 생성된 job 객체인데도 자동 완료 되는 이유는 무엇인가요?
fun main() = runBlocking<Unit> {
launch(CoroutineName("Coroutine1")) {
val newJob = Job()
launch(CoroutineName("Coroutine2") + newJob) {
delay(100L)
println("[${Thread.currentThread().name}] 코루틴 실행")
}
}
}
답변 1
1
mamu님 안녕하세요. 지식공유자 조세영입니다.
첫번째 코드의 경우 Job의 parent 인자로 넘기신 Job이 runBlocking 코루틴의 자식 코루틴의 Job입니다. 따라서 runBlocking 코루틴은 해당 Job이 완료되기까지 완료 중 상태에 머뭅니다.
하지만 두 번째 코드의 경우 Job이 parent 없이 생성되고 있습니다. 즉, 기존 runBlocking 의 Job과의 구조화가 깨지기 때문에 runBlocking 코루틴이 해당 Job을 기다리지 않고 완료됩니다.
즉, 해당 Job은 완료되지 않지만 runBlocking 코루틴이 완료돼 프로세스가 종료되는 것입니다.
답변이 도움이 되면 좋을 것 같습니다.
감사합니다.