코루틴에는 다양한 상태값들이 존재한다. 아래 그림을 참고하자.
각 상태를 코드로 확인해보자.
import kotlinx.coroutines.*
fun main() = runBlocking<Unit> {
val job : Job = launch {
delay(1000L)
}
// toString 메소드로 job의 상태값을 확인하면 JobSupport 객체에서 디버깅 용도로 만드는 문자열(toDebugString())을 사용하는 것이라서 직접 코드에서 사용하기는 어렵다.
println(job)
printJobState(job)
}
fun printJobState(job: Job) {
println(
"Job State \n" +
"isActive >> ${job.isActive}\n" +
"isCancelled >> ${job.isCancelled}\n" +
"isCompleted >> ${job.isCompleted}\n"
)
}
fun main() = runBlocking {
val job : Job = launch (start = CoroutineStart.LAZY) {
delay(1000L)
}
println(job)
printJobState(job)
}
import kotlinx.coroutines.*
fun main() = runBlocking {
val job : Job = launch {
delay(1000L)
}
// join 메소드를 실행하면 runBlocking 코루틴이 launch가 다 실행될때까지 일시중단. 이후 재게되서 로그 출력.
job.join() // launch 코루틴이 실행 안료될떄까지 일시중단
println(job)
printJobState(job)
}
import kotlinx.coroutines.*
fun main() = runBlocking {
val job : Job = launch {
while (true) {
// 작업이 실행중임
}
}
job.cancel() // 코루틴 취소 요청. -> Cancelling 상태로 전환.
println(job)
printJobState(job)
val job2 : Job = launch {
while (true) {
yield()
}
}
job2.cancelAndJoin()
println(job2)
printJobState(job)
}
상태값을 인지하고 코루틴개발에 임하는게 더 퀄리티 좋은 코드를 짤 수 있다. 잘 숙지해서 활용하도록 하자.