TIL

3강 코루틴 빌더와 Job

[1] runBlocking

fun main(): Unit = runBlocking {

}
fun main() {
  runBlocking {
    printWithThread("START")
    launch {
      delay(2_000L) // 코루틴을 지정 시간 동안 지연시킴
      printWithThread("LAUNCH END")
    }
}
  printWithThread("END")
}
[main] START
[main] LAUNCH END
[main] END

[2] 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(it)
      delay(500) // 1초에 2까지 출력
    } 
  }
  delay(1_000L) // 1초 기다리고
  job.cancel() // cancel 호출
}
fun main(): Unit = runBlocking {
  val job1 = launch {
    delay(1_000)
    printWithThread("Job 1")
}
  val job2 = launch {
    delay(1_000)
    printWithThread("Job 2")
} }
fun main(): Unit = runBlocking {
  val job1 = launch {
    delay(1_000)
    printWithThread("Job 1")
  }
  job1.join() // job1이 끝날 때까지 기다림
  val job2 = launch {
    delay(1_000)
    printWithThread("Job 2")
} }

[3] async

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

val eight = job.await() // 변수에 8이 담긴다.
suspend fun apiCall1(): Int {
  delay(1_000L)
  return 1
}

suspend fun apiCall2(): Int {
  delay(1_000L)
  return 2
}
fun main(): Unit = runBlocking {
  val time = measureTimeMillis {
    val job1 = async { apiCall1() }
    val job2 = async { apiCall2() }
    printWithThread(job1.await() + job2.await())
  }
  printWithThread("소요 시간 : $time ms") // 1000ms 조금 넘는 시간이 걸림
}
fun main(): Unit = runBlocking {
  val time = measureTimeMillis {
    val job1 = async { apiCall1() }
    val job2 = async { apiCall2(job1.await()) }
    printWithThread(job2.await())
  }
  printWithThread("소요 시간 : $time ms") // 2000ms 조금 넘는 시간
}
fun main(): Unit = runBlocking {
  val time = measureTimeMillis {
    val job1 = async(start = CoroutineStart.LAZY) { apiCall1() }
    val job2 = async(start = CoroutineStart.LAZY) { apiCall2() }
    printWithThread(job1.await() + job2.await())
  }
  printWithThread("소요 시간 : $time ms") // 2000ms 조금 넘는 시간
}
fun main(): Unit = runBlocking {
  val time = measureTimeMillis {
    val job1 = async(start = CoroutineStart.LAZY) { apiCall1() }
    val job2 = async(start = CoroutineStart.LAZY) { apiCall2() }
    printWithThread(job1.await() + job2.await())
  }
  job1.start()
  job2.start()
  printWithThread("소요 시간 : $time ms") // 1000ms 조금 넘는 시간
}