스레드와 가상 스레드: 자바 동시성 프로그래밍의 핵심 이해하기

스레드(Thread)의 기본 개념

스레드는 프로그램 실행 중 독립적인 실행 경로를 나타내는 가장 기본적인 동시성 단위입니다.

자바에서 모든 프로그램은 최소한 하나의 스레드(메인 스레드)를 가지며, 이는 JVM이 프로그램 실행 시작 시 제공합니다.

메인 스레드는 main() 메서드를 호출하여 프로그램 실행을 시작합니다.

특징 설명
정의 프로그램 내에서 독립적인 실행 경로
구성 요소 자체 프로그램 카운터, 스택, 로컬 변수 보유
장점 CPU 효율적 활용, 성능 향상, 리소스 공유 개선

스레드 생성 방법

자바에서 스레드를 생성하는 두 가지 주요 방법이 있습니다:

  1. Thread 클래스 확장

1
2
3
4
5
6
7
8
9
10
class MyThread extends Thread {
    public void run() {
        System.out.println(“Thread is running…”);
    }
}
// 사용 예
MyThread t1 = new MyThread();
t1.start();
cs

  1. Runnable 인터페이스 구현

1
2
3
4
5
6
7
8
9
10
11
class MyRunnable implements Runnable {
    public void run() {
        System.out.println(“Thread is running…”);
    }
}
// 사용 예
MyRunnable runnable = new MyRunnable();
Thread t1 = new Thread(runnable);
t1.start();
cs

스레드 생명주기

자바 스레드는 다음과 같은 상태를 거칩니다:

  1. New: 스레드 객체가 생성되었지만 아직 시작되지 않은 상태

  2. Runnable: start() 호출 후 실행 준비 상태

  3. Running: run() 메서드 실행 중인 상태

  4. Blocked/Waiting: 리소스나 신호를 기다리는 상태

  5. Timed Waiting: 지정된 시간 동안 대기하는 상태

  6. Terminated: 실행이 완료된 상태


가상 스레드(Virtual Thread)

가상 스레드는 Java 21에서 정식 도입된 경량 스레드로, 기존 플랫폼 스레드의 한계를 극복하기 위해 설계되었습니다.

 

플랫폼 스레드 vs 가상 스레드

특성 플랫폼 스레드 가상 스레드
구현 방식 OS 스레드의 래퍼 JVM에 의해 관리됨
메모리 사용 약 1MB 스택 메모리 수백 바이트 (힙 메모리 사용)
생성 가능 수 제한적 (OS 스레드 수에 의존) 수백만 개 가능
매핑 1:1 OS 스레드 매핑 다수의 가상 스레드가 소수의 OS 스레드에 매핑
적합한 작업 모든 유형의 작업 I/O 대기 시간이 긴 작업
목적 속도(낮은 지연 시간) 규모(높은 처리량)

가상 스레드 생성 방법

1
2
3
4
5
6
7
8
9
// 가상 스레드 생성 및 시작
Thread thread = Thread.ofVirtual().start(() > System.out.println(“Hello”));
thread.join();
// 이름이 있는 가상 스레드 생성
Thread namedThread = Thread.ofVirtual().name(“MyThread”).start(() > {
    System.out.println(“Named virtual thread running”);
});
cs

 

가상 스레드의 작동 방식

가상 스레드는 다음과 같은 방식으로 작동합니다:

  1. JVM은 플랫폼 스레드 풀을 유지 관리합니다(ForkJoinPool 사용).

  2. 가상 스레드가 생성되면 JVM은 이를 플랫폼 스레드에 스케줄링합니다.

  3. 가상 스레드가 I/O 작업 등으로 블로킹되면, JVM은 해당 가상 스레드를 일시 중단하고 플랫폼 스레드를 해제합니다.

  4. 해제된 플랫폼 스레드는 다른 가상 스레드를 실행할 수 있게 됩니다.

  5. 블로킹 작업이 완료되면 가상 스레드는 다시 스케줄링되어 실행을 계속합니다.


가상 스레드 사용 이점

가상 스레드는 다음과 같은 상황에서 특히 유용합니다:

  1. 높은 처리량이 필요한 동시성 애플리케이션: 수많은 동시 작업을 처리해야 하는 서버 애플리케이션

  2. I/O 집약적 작업: 대부분의 시간을 I/O 작업 대기에 소비하는 작업

  3. 스레드-당-요청 모델: 각 요청마다 별도의 스레드를 할당하는 모델

가상 스레드는 리액티브 프로그래밍의 복잡성 없이도 높은 동시성을 달성할 수 있게 해줍니다. 개발자는 기존의 명령형 프로그래밍 모델을 유지하면서도 수백만 개의 동시 작업을 효율적으로 처리할 수 있습니다.


스레드와 가상 스레드는 자바 동시성 프로그래밍의 핵심 요소입니다.

플랫폼 스레드는 모든 유형의 작업에 적합하지만 리소스 제약이 있는 반면,

가상 스레드는 I/O 집약적 작업에 최적화되어 높은 처리량을 제공합니다.

가상 스레드를 활용하면 기존 스레드 모델의 한계를 극복하고 더 효율적인 동시성 애플리케이션을 개발할 수 있습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다