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

갸나다로님의 프로필 이미지

작성한 질문수

2시간으로 끝내는 코루틴

3강. 코루틴 빌더와 Job

Job 질문이 있습니다

작성

·

103

1

이전 강의 설명에서

아래의 코드가 실행될 때 launch로 만든 코루틴이 바로 실행되지 않고 다음 코드로 넘어간다고 했는데

fun main(): Unit = runBlocking {
    println("START")
    launch {
    	newRoutine()
    }
    println("END")
}

왜 아래의 코드에서는 job 객체를 변수에 담으면 다음 코드로 넘어가는게 아니라 바로 실행이 되는건가요?

fun main(): Unit = runBlocking {
    val job = launch {
        (1..5).forEach {
            printWithThread(it)
            delay(500)
        }
    }

    delay(1_000L)
    job.cancel()
}

답변 1

1

최태현님의 프로필 이미지
최태현
지식공유자

안녕하세요 갸나다로님! 🙂 질문 주셔서 감사합니다.

결론부터 말씀드리면, 작성해주신 코드는 job 객체를 변수에 담더라도 다음 코드로 넘어갔는데, delay를 만나서 launch 안의 코드가 실행된 것입니다!

delay(1_000L) 함수 호출을 제외하고 실행시켜보시면, job을 만들자마자 job.cancel() 이 호출되며 표준 출력 없이 프로그램이 종료될거에요! 🙂

또 궁금하신 점 있으시면 언제든 편하게 질문 남겨주세요~

감사합니다! 🙏

갸나다로님의 프로필 이미지
갸나다로
질문자

아! 그럼 launch 로 만든 코루틴 안에서 처음 2번 반복이 될때 delay(500) 을 만나서 runBlocking의 코루틴이 재개되어도 delay(1_000L)때문에 1초가 지나기 전까지는 다시 launch의 코루틴으로 돌아가고 2번 째 반복이 끝나고 delay(500) 을 만나서 runBlocking코루틴으로 넘어가면 그때 job.cancel()을 호출하게 된거라고 이해하면 될까요?

최태현님의 프로필 이미지
최태현
지식공유자

정확하십니다! 👍 👍 delay를 만날 때마다 실행을 대기 중인 또 다른 코루틴이 있는지 확인하는 방식으로 동작한다고 이해해주시면 되어요~!

갸나다로님의 프로필 이미지
갸나다로
질문자

정말 감사합니다!

강사님 덕분에 코루틴에 대해 자세히 알게되어 너무 기쁘네요 ㅎㅎㅎ

최태현님의 프로필 이미지
최태현
지식공유자

아이고~ 열심히 들어주셔서 제가 감사드리죠! 🙏 언제든 편하게 질문 올려주세요~!!