들어가면서

Kotlin을 공부하면서 새로 알게되는 부분을 정리합니다.

Coroutine을 쓰면서 취소는 자원활용에 연관된다. Suspend 관련 함수를 사용하여 취소를 적용할수 있음

fun main(): Unit = runBlocking {
    val job1 = launch {
        delay(1_000L)
        printWithThread("Job 1")
    }
    val job2 = launch {
        delay(1_000L)
        printWithThread("Job 2")
    }
    delay(100)
    job1.cancel()
}

fun printWithThread(str: Any){
    println("[${Thread.currentThread().name}] $str")
}

수행결과

[main] Job 2


fun main(): Unit = runBlocking {
   val job1 = launch {
       delay(10) // 0.01 초만에 수행된다.
       printWithThread("Job 1")
   }
    delay(100) // 0.1초를 기다리는 동안
    job1.cancel()
}

fun printWithThread(str: Any){
    println("[${Thread.currentThread().name}] $str")
}

취소에 협력적이지 않으면 계속 수행될수있다. 즉 suspend 함수가 없으면 계속 수행된다.

CancellationException

코루틴 스스로 본인의 상태를 확인해, 취소 요청을 받았으면, CancellationException을 던진다.

  • isActive: 현재 코루틴이 활성화 되어 있는지, 취소 신호를 받았는지
  • Dispatchers.Default를 쓰는 이유는 throw CancellationException할때 main 스레드에서 처리하면 안되서 별도의 스레드를 띄워서 처리한다. (main 스레드는 이를 처리 못함)

fun main(): Unit = runBlocking {
  val job = launch(Dispatchers.Default) { // main 스레드와 다름
      var i = 1
      var nextPrintTime = System.currentTimeMillis()
      while(i<= 5){
          if(nextPrintTime <= System.currentTimeMillis()){
              printWithThread("${i++}출력")
              nextPrintTime += 1_000L
          }
          
          if(isActive){
              // 현재 취소 요청을 받았는지, 활성화 상태인지 알수있음
             throw CancellationException() //명백히 취소시킴
          }
      }
  }
    delay(100L)
    job.cancel()
}

try catch로 잡으면 취소 안됨..

fun main(): Unit = runBlocking {
    val job = launch {
        try{
            delay(1_000L)
        }catch (e: CancellationException){
            // do nothing..
        }
        printWithThread("delay에 의해 취소되지 않았다.")
    }
    delay(100L)
    printWithThread("취소 시작")
    job.cancel()
}