Language/Kotlin

[Coroutine] suspending method: 코루틴 일시 중단

개랭갱깽스타 2022. 2. 9. 14:57

suspending method

일시중단함수

 


 

yield

다른 코루틴에게 실행을 양보한다. (코틀린 모듈 최상위)

  • 예제(yield)
  •     suspend fun doSomething111(): Int {
            log("📗", "doSomething111-----------start")
            yield()
            log("📗", "doSomething111-----------end")
            return 13
        }
    
        suspend fun doSomething222(): Int {
            log("📘", "doSomething222-----------start")
            yield()
            log("📘", "doSomething222-----------end")
            return 29
        }
  • @Test
        fun yield_test() {
            runBlocking {
                val time = measureTimeMillis {
                    val one = doSomething111()
                    val two = doSomething222()
                    log("📙", "The answer is ${one + two}")
                }
                log("📙", "Completed in $time ms")
            }
        }

 

  • 예제(delay + yield)
  • @Test
        fun delay_yield_test() {
            log("📕", "yieldExample Start")
            runBlocking {
                launch {
                    log("📗", "1")
                    yield()
                    log("📗", "3")
                    yield()
                    log("📗", "5")
                }
    
                log("📙", "*****End 1111111*****")
    
                launch {
                    log("📘", "2")
                    delay(1000L)
                    log("📘", "4")
                    delay(1000L)
                    log("📘", "6")
                }
                log("📙", "*****End 22222222*****")
            }
            log("📕", "yieldExample End")
        }

 


 

delay

milisecond 단위로 코루틴을 잠시 대기시킨다. (코틀린 모듈 최상위)

  • Thread.sleep은 스레드 자체를 정지시키는데 반해, delay는 코루틴이 멈추지 않고 대기상태에 들어간다.

 

  • 예제 
  • suspend fun doSomething111(): Int {
    	log("📗", "doSomething111-----------start")
        	delay(1000L)
    	log("📗", "doSomething111-----------end")
        	return 13
    }
    
    suspend fun doSomething222(): Int {
    	log("📘", "doSomething222-----------start")
        	delay(1000L)
    	log("📘", "doSomething222-----------end")
        	return 29
    }
  • @Test
        fun delay_test() {
            runBlocking {
                val time = measureTimeMillis {
                    val one = doSomething111()
                    val two = doSomething222()
                    log("📙", "The answer is ${one + two}")
                }
                log("📙", "Completed in $time ms")
            }
        }

 


 

join

Job의 실행이 끝날때까지 대기시킨다. (Job 메소드)

  • 코루틴 블록이 완료 될때까지 다음 코드 수행을 대기한다.

 

  • 예제
  • fun testJoin() = runBlocking {
        log("📙", "***** START *****")
        val job1 = CoroutineScope(Dispatchers.Default).launch {
            log("📗", "Job one scope start")
            for (index in 0..5) {
                log("📗", "Job one scope $index")
            }
            log("📗", "Job one scope for end")
        }.join()
    
        val job2 = CoroutineScope(Dispatchers.Default).launch {
            log("📘", "Job two scope for start")
            for (index in 0..7) {
                log("📘", "Job two scope index $index")
            }
            log("📘", "Job two scope for end")
        }
    
        log("📙", "***** END *****")
    }

 


joinAll

모든 작업이 끝날때까지 현재 작업을 일시중단시킨다.

  • 예제
  • fun testJoinAll() = runBlocking {  //without cancel
        log("📙", "***** START *****")
        val job1 = CoroutineScope(Dispatchers.Default).launch {
            log("📗", "Job one scope start")
            for (index in 0..5) {
                log("📗", "Job one scope $index")
            }
            log("📗", "Job one scope for end")
        }//.join()
    
        val job2 = CoroutineScope(Dispatchers.Default).launch {
            log("📘", "Job two scope for start")
            for (index in 0..7) {
                log("📘", "Job two scope index $index")
            }
            log("📘", "Job two scope for end")
        }//.join()
    
        joinAll(job1, job2)
    
        log("📙", "***** END *****")
    }

 


 

await

Deferred 의 실행이 끝날때까지 대기시키고 결과값을 반환한다.

  • 예제
  • fun testAwait() = runBlocking {
        log("📙", "***** START *****")
        val job1 = CoroutineScope(Dispatchers.Default).async {
            log("📗", "Job one scope start")
            delay(2000)
            log("📗", "Job one scope end")
            11111111
        }
    
        val job2Value = CoroutineScope(Dispatchers.Default).async {
            log("📗", "Job two scope start")
            delay(1000)
            log("📗", "Job two scope end")
            222222222
        }.await()
    
        log("📙", "await job1Value is ${job1.await()} job2Value is ${job2Value}")
        log("📙", "***** END *****")
    }

 


 

withTimeout

코루틴 제한시간을 설정하고 그때까지 처리가 끝나지 않았을 경우,

  • 블럭을 취소하고 TimeoutCancellationException을 throw한다.

 


 

withTimeoutOrNull

withTimeout을 처리 중 제한시간이 경과 되었을 경우,

  • 예외 대신 null을 반환한다.

 

 

 

.참고

https://medium.com/@limgyumin/코틀린-코루틴-제어-5132380dad7f

반응형