필요하지 않은 Coroutine을 적절히 취소해 Computing 자원을 아껴야한다!!
fun main(): Unit = runBlocking {
val job = launch {
var i = 1
var nextPrintTime = System.currentTimeMillis()
while (i <= 5) {
if (System.currentTimeMillis() >= nextPrintTime) {
printWithThread("Hello $i")
nextPrintTime += 1_000L
i++
}
}
}
delay(100L)
job.cancel()
}
- 위 코드에서 분명
cancel 을 사용해 코루틴을 취소시켰지만, 실제 출력 결과는 1~5까지 출력이 되는것을 확인할 수 있다.
- 코루틴 취소에 협력하는 함수가
lauch 안에 명시되어 있지 않기 때문이다.
fun main(): Unit = runBlocking {
val job = launch(Dispatchers.Default) {
var i = 1
var nextPrintTime = System.currentTimeMillis()
while (i <= 5) {
if (System.currentTimeMillis() >= nextPrintTime) {
printWithThread("Hello $i")
nextPrintTime += 1_000L
i++
}
if (!isActive) {
throw CancellationException()
}
}
}
delay(100L)
job.cancel()
}
- 위와같이 Coroutine이 실행중인지 확인할 수 있는 함수
isActive 를 통해 CancellationException 을 던져주었다.
launch 에 Dispatchers.Default 를 사용하여 다른 스레드에서 launch 코드를 실행할 수 있도록 하였다.