본문 바로가기
공부/코틀린코루틴:딥다이브(마르친 모스카와)

8장 - 잡과 자식 코루틴 기다리기

by 띵커베르 2024. 1. 29.
728x90
  • 자식은 부모로부터 컨텍스트를 상속받습니다.
  • 부모는 모든 자식이 작업을 마칠 때까지 기다립니다.
  • 부모 코투린이 취소되면 자식 코루틴도 취소됩니다.
  • 자식 코루틴에서 에러가 발생하면, 부모 코루틴 또한 에러로 소멸합니다.
  • Job 이란?
    • 시작된 코루틴에 대한 핸들로 사용된다.
    • launch 코루틴 빌더는 Job 객체를 반환하고, 이 객체를 사용하여 코루틴이 완료될 때까지 대기하거나 코루틴의 상태를 관리할 수 있다.
  • 코루틴 빌더는 부모의 잡을 기초로 자신들의 잡을 생성한다.
    • 모든 코루틴 빌더는 자신만의 잡을 생성합니다.
    • 대부분의 코루틴 빌더는 잡을 반환하므로 어느 곳에서든 사용할 수 있습니다.
    • launch 의 명시적 반환 타입이 Job 이라는 사실을 통해 확인할 수 있습니다.
    • Job 은 코루틴이 상속하지 않는 유일한 코루틴 컨텍스트이며, 이는 코루틴에서 아주 중요한 법칙입니다.
    • 부모 잡은 자식 잡 모두를 참조할 수 있으며, 자식 또한 부모를 참조할 수 있습니다.
    • 잡을 참조할 수 있는 부모-자식 관계가 있기 때문에 코루틴 스코프 내에서 취소와 예외 처리 구현이 가능합니다.
  • 자식들 기다리기
    • join 메서드를 사용합니다.
    • join 은 지정한 잡이 Completed 나 Cancelled 와 같은 마지막 상태에 도달할 때까지 기다리는 중단 함수 입니다.
  • 잡 팩토리 함수
    • Job 은 Job() 팩토리 함수를 사용하면 코루틴 없이도 Job을 만들 수  없습니다.
    • 팩토리 함수로 생성하는 잡은 어떤 코루틴과도 연관되지 않으며, 컨텍스트로 사용될 수 있다.
    • 한개 이상의 자식 코루틴을 가진 부모 잡으로 사용할수도 있다.
  •  
@Test
fun `코루틴 딥다이브 94페이지`() {
    runBlocking { // 메인 코루틴 시작
        val job = Job() // 부모 Job 생성

        launch(job) {// 첫번째 코루틴 시작
            repeat(5) { num ->
                delay(200)
                println("Rep$num")
            }
        }

        launch { // 독립적인 두번째 코루틴 시작
            delay(500)
            println("second")
            job.complete() // 첫 번째 코루틴의 부모 Job 을 완료 상태로 변경
        }

        job.join() // 첫 번째 코루틴 작업 완료를 기다림

        launch(job) { // 세번 째 코루틴 시작(부모 Job을 상속받음)
            println("Will not be printed")
        }

        println("Done")
    }
}
728x90

'공부 > 코틀린코루틴:딥다이브(마르친 모스카와)' 카테고리의 다른 글

12장 - 디스패처  (0) 2024.02.20
9장 - 취소  (0) 2024.02.05
7장 - 코루틴 컨텍스트  (0) 2024.01.29
6장 - 코루틴 빌더  (0) 2024.01.29
4장 - 코루틴의 실제 구현  (2) 2024.01.14

댓글