launch
코루틴을 만드는 코루틴 빌더로 Job
객체를 반환하고 비동기 작업 수행에 대한 결과값을 반환하지 않지 않는다.
join()
Job
객체는 생성과 동시에 실행되는데 매번 필요한 위치에서 Job
을 생성하고 실행하는 것은 코루틴 실행에 있어서 유연하지 않게 된다.
이러한 문제점을 해결하기 위해서는 Job
을 생성한 후에 필요할 때 실행되도록 해야하는데 join()
을 호출하면 Job
이 실행되고 있는 코루틴을 일시 중단시키고 Job
이 종료될 때까지 대기한다.
import kotlinx.coroutines.*
fun main() = runBlocking {
println("Start")
job1.join()
job2.join()
// or joinAll(job1, job2)
println("End")
}
val job1: Job = GlobalScope.launch {
var i = 0
while (i < 3) {
delay(1000)
println("Running1 $i")
i++
}
}
val job2: Job = GlobalScope.launch {
var i = 0
while (i < 3) {
delay(1000)
println("Running2 $i")
i++
}
}
// 결과는 실행 시 마다 다름
// Start
// Running2 0
// Running1 0
// Running2 1
// Running1 1
// Running1 2
// Running2 2
// End
start()
코루틴 빌더 launch
의 start()
파라미터에 CoroutineStart.Lazy
를 할당하면 해당 코루틴을 호출하는 시점에 실행되도록 할 수 있지만 join()
과 다르게 start()
는 실행만 시키고 종료를 대기하지 않는다. (non-blocking
)
import kotlinx.coroutines.*
// job.start()
fun main() = runBlocking {
println("Start")
job.start()
println("End")
}
val job: Job = GlobalScope.launch(start = CoroutineStart.LAZY) {
var i = 0
while (i < 3) {
delay(1000)
println("Running $i")
i++
}
}
// Start
// End
// Running 0
// Running 1
// Running 2
import kotlinx.coroutines.*
// job.join()
fun main() = runBlocking {
println("Start")
job.join()
println("End")
}
val job: Job = GlobalScope.launch(start = CoroutineStart.LAZY) {
var i = 0
while (i < 3) {
delay(1000)
println("Running $i")
i++
}
}
// Start
// Running 0
// Running 1
// Running 2
// End
cancel()
Job
을 취소하는 것은 cancel()
을 호출하면 된다.
import kotlinx.coroutines.*
fun main() = runBlocking {
println("Start")
job.cancel()
println("End")
}
val job: Job = GlobalScope.launch {
var i = 0
while (i < 3) {
delay(1000)
println("Running $i")
i++
}
}
// Start
// End
Job 의 상태
Job
의 상태는 생성(New
), 실행 중(Active
), 완료 중(Completing
), 실행 완료(Completed
), 취소 중(Cancelling
), 취소 완료(Cancelled
) 6가지이며 isActive
, isCanceled
, isCompleted
로 확인할 수 있다.
- 기본적으로는 자동으로 실행 중(
Active
) 상태가 된다. start()
파라미터에CoroutineStart.Lazy
를 할당하여 코루틴을 실행하는 경우에는 기본적으로 생성(New
) 상태이고, 해당 코루틴을 호출하는 시점에 실행 중(Active
) 상태가 된다.- 완료 중(
Completing
) 혹은 취소 중(Cancelling
) 상태에서는 완료 전에 리소스 반환 등의 작업을 한다.