코틀린

[Youtube DiMo] 31강. 동기처리(마지막)

iseohyun 2022. 5. 3.

목차

    [31강] https://youtu.be/Lpieg1zrKdg

     

    0. 컨셉

    코드1
    ...(10초 후)
    코드2
    ...(응답이 오면)
    코드3

    코드1에서 10초 기다렸다가 코드2를 수행 할 수 있을까?
    코드2에서 응답이 오면 코드3으로 진행 되도록 할 수 있을까?
    만약 프로그램이 나 혼자라면, 10초 동안 의미 없는 일을 계속 시킬 수도 있으나, 잠시 대기하라는 명령어를 넣어 줄 수도 있습니다. 또는 "응답이 오면(상태가 바뀌면)" 이라는 명령어가 있다면 편리할 것입니다.

     

    1. 비동기 함수 불러오기

    kotlinx.coroutines.* 을 import하기
    launch로 실행하기 (람다함수 형)
    main이 종료되면 다 같이 종료되므로 runBlocking을 통해서 막아주기
    import kotlinx.coroutines.*
    
    fun main() {
    	runBlocking{ // main이 종료되는 것을 방지
            launch{
                for(i in 1..5){
                    println(i)
                }
            }
        }
    }

     

     

    2. jong/await

    delay(milisecond: Long) : 기다려
    join과 await : 해당 프로세스가 종료될 때까지 기다려
    import kotlinx.coroutines.*
    
    fun main() {
    	runBlocking{ // main이 종료되는 것을 방지
            val a = launch{
                for(i in 1..5){
                    println(i)
                    delay(10)
                }
                "launch 종료"
            }
            
            val b = async {
                println("async 실행")
                delay(20)
                "async 반환값"
            }
            
            println("시작")
            println(b.await()) // b.가 종료 될 때까지 기다렸다가 다음 코드를 수행합니다.
            
            println("async 종료")
            a.join()	// a.가 수행 완료 될 때까지 기다립니다.
            println("launch 종료")
        }
    }
    시작
    1
    async 실행
    2
    3
    async 반환값
    async 종료
    4
    5
    launch 종료

     

     

    3. cancel

    import kotlinx.coroutines.*
    
    fun main() {
    	runBlocking{ // main이 종료되는 것을 방지
            val a = launch{
                for(i in 1..5){
                    println(i)
                    delay(10)
                }
                "launch 종료"
            }
            
            val b = async {
                println("async 실행")
                delay(20)
                "async 반환값"
            }
            
            println("시작")
            println(b.await()) // b.가 종료 될 때까지 기다렸다가 다음 코드를 수행합니다.
            
            println("async 종료")
            a.cancel()	// a.가 수행 완료 될 때까지 기다립니다.
            println("launch 종료")
        }
    }
    시작
    1
    async 실행
    2
    3
    async 반환값
    async 종료
    launch 종료

     

     

    4. 시간제한 withTimeoutOrNull

    import kotlinx.coroutines.*
    
    fun main() {
    	runBlocking{ // main이 종료되는 것을 방지
            var result = withTimeoutOrNull(50){ // 100으로 바꾸고 실행해보자
                for(i in 1..8) {
                    println(i)
                    delay(10)
                }
                "Finish"
            }
            
            println(result)
        }
    }
    1
    2
    3
    4
    null

    댓글