스레드(Thread)의 기본 개념
스레드는 프로그램 실행 중 독립적인 실행 경로를 나타내는 가장 기본적인 동시성 단위입니다.
자바에서 모든 프로그램은 최소한 하나의 스레드(메인 스레드)를 가지며, 이는 JVM이 프로그램 실행 시작 시 제공합니다.
메인 스레드는 main() 메서드를 호출하여 프로그램 실행을 시작합니다.
특징 | 설명 |
---|---|
정의 | 프로그램 내에서 독립적인 실행 경로 |
구성 요소 | 자체 프로그램 카운터, 스택, 로컬 변수 보유 |
장점 | CPU 효율적 활용, 성능 향상, 리소스 공유 개선 |
스레드 생성 방법
자바에서 스레드를 생성하는 두 가지 주요 방법이 있습니다:
-
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 |
-
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 |
스레드 생명주기
자바 스레드는 다음과 같은 상태를 거칩니다:
-
New: 스레드 객체가 생성되었지만 아직 시작되지 않은 상태
-
Runnable: start() 호출 후 실행 준비 상태
-
Running: run() 메서드 실행 중인 상태
-
Blocked/Waiting: 리소스나 신호를 기다리는 상태
-
Timed Waiting: 지정된 시간 동안 대기하는 상태
-
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 |
가상 스레드의 작동 방식
가상 스레드는 다음과 같은 방식으로 작동합니다:
-
JVM은 플랫폼 스레드 풀을 유지 관리합니다(ForkJoinPool 사용).
-
가상 스레드가 생성되면 JVM은 이를 플랫폼 스레드에 스케줄링합니다.
-
가상 스레드가 I/O 작업 등으로 블로킹되면, JVM은 해당 가상 스레드를 일시 중단하고 플랫폼 스레드를 해제합니다.
-
해제된 플랫폼 스레드는 다른 가상 스레드를 실행할 수 있게 됩니다.
-
블로킹 작업이 완료되면 가상 스레드는 다시 스케줄링되어 실행을 계속합니다.
가상 스레드 사용 이점
가상 스레드는 다음과 같은 상황에서 특히 유용합니다:
-
높은 처리량이 필요한 동시성 애플리케이션: 수많은 동시 작업을 처리해야 하는 서버 애플리케이션
-
I/O 집약적 작업: 대부분의 시간을 I/O 작업 대기에 소비하는 작업
-
스레드-당-요청 모델: 각 요청마다 별도의 스레드를 할당하는 모델
가상 스레드는 리액티브 프로그래밍의 복잡성 없이도 높은 동시성을 달성할 수 있게 해줍니다. 개발자는 기존의 명령형 프로그래밍 모델을 유지하면서도 수백만 개의 동시 작업을 효율적으로 처리할 수 있습니다.
스레드와 가상 스레드는 자바 동시성 프로그래밍의 핵심 요소입니다.
플랫폼 스레드는 모든 유형의 작업에 적합하지만 리소스 제약이 있는 반면,
가상 스레드는 I/O 집약적 작업에 최적화되어 높은 처리량을 제공합니다.
가상 스레드를 활용하면 기존 스레드 모델의 한계를 극복하고 더 효율적인 동시성 애플리케이션을 개발할 수 있습니다.