runBlocking : 새로운 Coroutine을 만들고 루틴 세계와 코루틴 세계를 이어주는 역할

fun main() {
    runBlocking {
        printWithThread("Start")
        launch {
            delay(2_000L)
            printWithThread("Launch End")
        }
    }

    printWithThread("End")
}
[main @coroutine#1] START
[main @coroutine#2] LAUNCH END
[main] END

launch : 반환값이 없는 코루틴을 만든다.

fun main(): Unit = runBlocking {
		val job = launch(start = CoroutineStart.LAZY) {
        printWithThread("Hello Launch")
    }

    delay(1_000L)
    job.start()
}
fun main(): Unit = runBlocking {
    val job = launch {
        (1..5).forEach {
            printWithThread("Hello $it")
            delay(500)
        }
    }

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

async : 주어진 함수의 실행 결과를 반환할 수 있다.

fun main(): Unit = runBlocking {
    val job = async {
        3 + 5
    }
    val eight = job.await()
    printWithThread(eight)
}