inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

2시간으로 끝내는 코루틴

4강. 코루틴의 취소

코루틴 취소 관련 질문

292

Olive

작성한 질문수 4

1

fun main(): Unit = runBlocking {
    val job = launch {
        var i = 1
        var nextPrintTime = System.currentTimeMillis()
        while (i <= 5) {
            if(nextPrintTime <= System.currentTimeMillis()){
                printWithThread("${i++}번째 출력!")
                nextPrintTime += 1_000L
            }
        }
    }

    delay(100L)
    job.cancel()
}

수업 때 예시로 보여주신 코드인데 이 코드는 "5번째 출력!"까지 출력하고 끝이 나는데요.

 

반면에 아래 코드는 한번만 출력하고 끝이 납니다.

fun main(): Unit = runBlocking {
    val job = launch {
        var nextPrintTime = System.currentTimeMillis()
        repeat(5) {
            if (nextPrintTime <= System.currentTimeMillis()) {
                printWithThread("${it + 1}번째 출력!!")
                nextPrintTime += 1_000L
            }
        }
    }

    delay(100L)
    job.cancel()
}

이는 단순히 repeat문이 무한루프가 아니어서 나오는 차이일까요?

kotlin coroutine

답변 1

0

최태현

안녕하세요 Olive님! 질문 주셔서 감사합니다! 😊

네네 맞습니다, repeat 문이기 때문에 다음과 같이 동작하는 것으로 생각해주시면 되어요!

repeat(5) {
  if (...) 
}

 

  • 각 코드 한 줄 한 줄 마다 대략적으로 1ms가 걸린다고 생각해보자! (실제로는 1ms 보다 더 적게 걸릴겁니다!) 또한, repeat 으로 코드가 넘어오기 전 nextPrintTime = 0이라고 생각하자.

  • 그럼 최초 repeat이 수행되면, 0 <= 1 이니 if 조건이 true이고 if 안의 코드가 실행될겁니다.

    • 이때 한 번 출력이 되고, nextPrintTime = 1000 이 되겠죠!

  • 다음으로 두 번째 repeat이 수행될 건데, 코드 한 줄당 1ms가 걸리면 잘 쳐줘도 4~5ms 정도 지났을테니 1000 <= 4라서 if 조건이 false가 됩니다.

    • 따라서 두 번째 repeat은 pass될거에요!

  • 비슷하게 세 번째 repeat은 1000 <= 5라서 false, 네 번째 repeat 역시 false, 다섯 번째까지 false가 나오면서 최종적으로 한 번만 출력된 이후 프로그램은 종료하게 됩니다.

 

만약 무한루프였다면, 어쨌거나 5번의 출력을 할동안 위의 과정을 수백번, 수천번 반복하겠지만 repeat은 말 그대로 N번 시도 이후 해당 반복을 종료해버리니 위와 같은 차이가 발생하게 됩니다!

 

강의 보시면서 또 궁금한 점 있으시면 편하게 질문 주세요!

감사합니다!! 😊 🙇

Dispatchers 별 차이점 관련 질문

0

91

1

코루틴과 가상 스레드의 차이가 궁금합니다.

1

307

2

Coroutine과 ThreadLocal관련 질문

0

152

2

선생님 강의를 듣고 크롤링에 코루틴을 적용해보고 있습니다. 그런데 코루틴이 하나만 나와서 동시처리가 안되는데 혹시 봐주실 수 있나요??

1

114

1

7강에 대해서 궁금증이 있는데요

1

116

2

Spring MVC에서 corountine 활용 방안

1

538

1

9강 코루틴 중단과 재개관련 문의 드립니다.

0

124

2

suspend 함수에 관해 추가적인 질문 있습니다! (runcatching, Result)

0

126

1

간단 질문.. join() vs delay()

0

157

2

코루틴을 잘 사용하고 있는지 궁금합니다.

0

196

1

CoroutineScope & Dispatcher 질문

0

160

2

async await 관련 질문

1

135

2

코루틴 실행 순서 궁금합니다.

1

231

2

corutine task에 대한 질문

1

195

2

completing의 존재의의가 궁금합니다.

1

161

1

코루틴 dispatcher IO관련 질문

0

187

1

Job 질문이 있습니다

1

203

1

스프링 MVC 환경에서의 코루틴

1

2093

1

자식1, 2와 부모코루틴의 관계

1

225

1

한 suspend fun 의 반환값이 다른 suspend fun의 파라미터로 쓰일 때

1

329

2

delay 함수에 대해 질문이 있습니다

1

392

1

runBlocking을 사용하는 경우가 있을까요?

0

399

1

delay가 없으면 실행 안 되는 이유

0

294

1

코루틴 스코프

0

312

1