코루틴의 생명주기는 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