Kotlin/포스팅

코루틴 잡 생명 주기

짜집퍼박사(짜박) 2024. 1. 9. 17:55

코루틴의 생명주기는 Job이라는 인터페이스를 통해 관리됩니다. Job은 특정 코루틴의 생명주기와 상태를 추상화한 것으로, 코루틴이 활성화되어 있는지, 완료되었는지, 취소되었는지 등을 관리합니다. 이를 통해 코루틴의 실행과 관련된 동작을 제어하고 취소하거나 대기할 수 있습니다.

 

1. Job의 기본 상태

- Active: 코루틴이 실행 중인 상태입니다. 비동기 작업이 진행 중이거나, 코루틴이 아직 완료되지 않은 경우에 해당합니다.
- Completed: 코루틴이 정상적으로 완료된 상태입니다. 모든 코드가 실행되고 반환값이 나온 경우에 해당됩니다.
- Cancelled: 코루틴이 취소된 상태입니다. cancel 함수가 호출되거나 예외가 발생하여 코루틴이 중단된 경우에 해당됩니다.

 

launch 함수로 Job 생성

import kotlinx.coroutines.*

fun main() = runBlocking {
    val job = launch {
        // 비동기 작업
        delay(1000)
        println("Coroutine is running.")
    }

    job.join() // 코루틴이 완료될 때까지 대기
    println("End")
}

cancel 함수로 Job 취소

import kotlinx.coroutines.*

fun main() = runBlocking {
    val job = launch {
        // 비동기 작업
        delay(1000)
        println("Coroutine is running.")
    }

    delay(500)
    job.cancel() // 코루틴을 취소하고 예외 발생
    job.join() // 코루틴이 완료될 때까지 대기

    println("End")
}

 

3. Job의 상태 확인

isActive 함수

isActive 함수를 통해 현재 코루틴이 활성화되어 있는지 확인할 수 있습니다.

import kotlinx.coroutines.*

fun main() = runBlocking {
    val job = launch {
        // 비동기 작업
        delay(1000)
        println("Coroutine is running.")
    }

    delay(500)
    println("Job is active: ${job.isActive}")

    job.join()
    println("Job is active: ${job.isActive}")
    println("End")
}

 

4. Job의 예외 처리

코루틴이 예외로 인해 종료되면 해당 예외를 처리할 수 있습니다.

import kotlinx.coroutines.*

fun main() = runBlocking {
    val job = launch {
        try {
            // 비동기 작업
            delay(1000)
            throw RuntimeException("An error occurred")
        } catch (e: Exception) {
            println("Caught an exception: ${e.message}")
        }
    }

    job.join()
    println("End")
}

 

5. Job의 부모-자식 관계

부모 코루틴이 취소되면 해당 부모에 속한 모든 자식 코루틴도 취소됩니다.

import kotlinx.coroutines.*

fun main() = runBlocking {
    val parentJob = launch {
        launch {
            // 자식 코루틴
            delay(500)
            println("Child coroutine 1 is done.")
        }

        launch {
            // 다른 자식 코루틴
            delay(1000)
            println("Child coroutine 2 is done.")
        }
    }

    delay(700)
    parentJob.cancel() // 부모 코루틴 취소
    parentJob.join() // 부모 코루틴이 완료될 때까지 대기

    println("End")
}

코루틴의 Job을 통해 코루틴의 생명주기와 상태를 관리할 수 있습니다. 특히 cancel 함수를 사용하여 코루틴을 취소하거나, isActive 함수를 통해 현재 코루틴이 활성화되어 있는지 확인할 수 있습니다. 또한 예외 처리를 통해 예외를 적절히 처리할 수 있습니다.

 

With ChatGPT

'Kotlin > 포스팅' 카테고리의 다른 글

코루틴 타임아웃  (0) 2024.01.09
코루틴 취소  (0) 2024.01.09
코루틴 흐름 제어  (0) 2024.01.09
코루틴 문맥  (0) 2024.01.07
코루틴 구조적 동시성  (0) 2024.01.07