runBlocking : 새로운 Coroutine을 만들고 루틴 세계와 코루틴 세계를 이어주는 역할
runBlocking 함수는 runBlocking 으로 인해 만들어진 코루틴과 그 안에 있는 코루틴이 모두 완료될 때 까지 스레드를 블락시킨다. 스레드가 블락되면 그 스레드는 블락이 풀릴 때 까지 다른 코드를 실행시킬 수 없다.
fun main() {
runBlocking {
printWithThread("Start")
launch {
delay(2_000L)
printWithThread("Launch End")
}
}
printWithThread("End")
}
- 위 코드를 살펴보면, main 함수에는
runBlocking 으로 만들어진 코루틴이 있고, 코루틴 안에 다시 launch 로 만들어진 코루틴이 있다. 여기서 사용된 delay 함수는 코루틴을 지정된 시간 동안 지연시키는 함수이다.
- 이 코드에서 end가 출력되기 위해서는
runBlocking 때문에 두 개의 코루틴이 모두 완전히 종료되어야 하고 따라서 출력 결과는 아래와 같다.
[main @coroutine#1] START
[main @coroutine#2] LAUNCH END
[main] END
runBlocking 함수를 함부로 사용하면 스레드가 블락되어 다른 코드를 실행할 수 없이 프로그램이 멈출 수 있게 된다.
- 그렇기 때문에
runBlocking 함수를 계속해서 사용해서는 안되고, 프로그램에 진입하는 최초의 메인 함수나 테스트 코드를 시작할 때만 사용하는 것이 좋다.
launch : 반환값이 없는 코루틴을 만든다.
fun main(): Unit = runBlocking {
val job = launch(start = CoroutineStart.LAZY) {
printWithThread("Hello Launch")
}
delay(1_000L)
job.start()
}
- 위 코드에서
job 은 코루틴을 제어할 수 있는 객체 Job을 반환받는다.
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")
}
}
start : 시작 신호
cancel: 취소 신호
join : 코루틴이 완료될 때 까지 대기
async : 주어진 함수의 실행 결과를 반환할 수 있다.
fun main(): Unit = runBlocking {
val job = async {
3 + 5
}
val eight = job.await()
printWithThread(eight)
}