본문 바로가기
💻 프로그래밍

[🔥 Coroutine] #3 예제로 복습하기

by 콩드로이드 2022. 11. 12.

안녕하세요 :)

오늘은 예제로 여태까지 1,2장에서 공부한 코루틴에 대해 복습하고자 합니당 

다음 포스팅은 Job으로 돌아오겠습니다 🙇🏻‍♀️


CoroutineBuilder

코루틴을 생성하는 함수

 

1. runBlocking

runBlocking내의 코드블록이 수행될 때까지 다른 코드가 수행되지 못하게 Block

runBlocking내의 this는 코루틴이 Receiver임을 알 수 있음

출력값

Active : 현재 코루틴의 활성화 상태 

 

2. launch

💡 runBlocking과의 차이 : runBlocking은 코드블럭 수행완료까지 다른 블록을 수행하지 못하게 Block,

launch는 다른 코드를 함께 수행하게 함 (코드를 큐에 넣어두고 다음 순서를 기다림)

⭐️ 하지만, runBlocking으로 코루틴을 만들고 나서 launch 호출 가능

 

fun main() = runBlocking {
    launch {
        println("launch : ${Thread.currentThread().name}")
        println("World!")
    }
    println("runBlocking : ${Thread.currentThread().name}")
    println("Hello")
}

 

결과는 어떻게 나올까? 

 

왜 위와 같은 결과가 나올까? 

둘 다 메인 Thread를 사용하기 때문에 launch안에 내용이 runBlocking보다 늦게 수행된다

runBlocking이 메인Thread 사용완료까지 launch가 기다리는 셈..!

runBlocking은 Hello를 찍고, 끝내지 않고 launch의 완료를 기다림 👀

 


delay

밀리세컨드 단위의 시간을 인자로 지정, delay를 만나면 중단점(suspension point)이 되면서 

메인Thread를 양보해줌

 

fun main() = runBlocking {
    launch {
        println("World!")
    }
    delay(500L)
    println("Hello")
}

출력값

delay가 걸리면서 launch가 먼저 실행되고, Hello가 후에 실행

 

delay와 sleep의 차이

fun main() = runBlocking {
    launch {
        println("World!")
    }
    Thread.sleep(500L)
    println("Hello")
}

 

왜 delay와는 결과가 다를까?

📌 sleep은 OS에게 잠시 쉰다고 하고, 현재 Thread를 양보하지 않고 가지고 있음 즉, 자신이 쉬어가고 다른 코루틴을 실행하지 않음 

 


코루틴은 기본적으로  상위가 하위를 책임지는 계층적(구조적)인 구조

따라서 runBlocking은 launch1,2 끝나기 전까진 종료되지 않아서, 4!는 마지막에 찍힘

runBlocking을 취소하는 경우, 자식인 launch1,2도 종료됨

fun main() {
  runBlocking {
    	launch {
      	  println("launch1")
       	  delay(1000L) 
       	  println("3!")
    	}

    	launch {
      		println("launch2")
      		println("1!")
    	 }
    	delay(500L)
    	println("2!")
	}
	println("4!")
}