Programming/Kotlin

[Kotlin] 코루틴 (+Virtual Thread)

코딩하는 포메라니안 2026. 3. 28. 17:01

코루틴이란?

  • co-routine = 협력하는 + 함수
  • ‘실행의 지연과 재개를 허용함으로써, 비선점적 멀티태스킹을 위한 서브 루틴을 일반화한 컴퓨터 프로그램 구성요소’
  • 코루틴은 병행성은 제공하지만, 병렬성은 제공하지 않는다. (= 물리적이 아닌, 논리적으로 작업이 동시에 실행되는 것처럼 보이는 것)

비선점적 멀티태스킹이란?

  • 비선점형: 하나의 프로세스가 CPU를 할당받으면 종료되기 전까지 다른 프로세스가 CPU를 강제로 차지할 수 없음(코루틴은 명시적으로 양보해야 전환됨)
  • 선점형: 하나의 프로세스가 다른 프로세스 대신에 CPU를 강제로 차지할 수 있음(thread는 스케쥴링 기준에 따라 CPU를 사용하도록 되어있음, 즉 애플리케이션 코드가 아닌 다른 요소에 의해 강제로 변경됨)

코루틴 사용

fun main(): Unit = runBlocking {
  println("[main]START")
  launch {
    newRoutine()
    println("[new1]TEST")
  }
  yield()  
  println("[main]END")
}

suspend fun newRoutine() {
  val num1 = 1
  val num2 = 2
  yield()
  println("[new2]${num1 + num2}")
}

/*
[main]START
[new1]TEST
[new2]3
[main]END
*/
  • runBlocking: 일반 루틴 세계와 코루틴 세계를 연결하는 함수, 새로운 코루틴을 생성
  • launch함수: 주로 반환 값이 없는 코루틴을 만들 때 사용
  • yield(): 양보하다 = 지금 코루틴의 실행을 잠시 멈추고 다른 코루틴이 실행되도록 양보하겠다.
  • suspend키워드: 함수가 실행 도중 비동기적으로 일시 중단(suspend)되었다가 다시 재개될 수 있음을 나타냄

 


공부하다보니, Context Switching 비용을 줄여 효율적으로 서비스할 수 있다는 점에서 Java의 Virtual Thread와 아주 유사하다는 생각이 들어 비교 정리를 해보았다.

 

 

 

코루틴과 Virtual Thread

코루틴의 동작

1) 하나의 함수가 실행되다가, yield()를 명시적으로 작성하거나 보통 I/O 호출할 때 라이브러리 내부적으로 양보함

2) 다른 함수의 동작 실행하다가 또 yield되면

3) 1번 과정에서 중지된 함수 재개

Virtual Thread의 동작

1) 커널 스레드가 CPU를 점유하면 매핑된 자바 스레드에 mount된 Virtual Thread 실행

2) Virtual Thread는 실행 중 Block되면 mount되어 있던 자바 스레드에서 unmount됨

3) 다른 Virtual Thread가 자바 스레드에 mount되어 실행됨

 

공통점

- OS단의 Thread는 선점형 스케줄링

 

차이점

- 코루틴 = 비동기 흐름을 동기 처럼 표현(내부적으로는, 적은 Thread를 사용하여 함수들 간에 협력하여 동시성을 확보)

- virtual thread = block 허용, block에 대한 비용을 줄임

참고) webflux = block X (=non-blocking, 이벤트 기반)임으로, 코루틴을 활용하기도 함

'Programming > Kotlin' 카테고리의 다른 글

[Kotlin] 이펙티브 코틀린  (0) 2026.03.31
Kotlin의 기초  (0) 2026.03.28