가상 스레드(Virtual Thread)
- Java 16 부터 도입된 가상 스레드는 가벼운 스레드 모델을 제공
- 기존 스레드보다 더 적은 자원을 사용하여 수백만 개의 스레드를 생성할 수 있다.
- 가상 스레드는 OS 스레드와 1:1 대응되지 않고, N:1 또는 M:N 의 관계를 가질 수 있다. 즉, 작은 수의 실제 OS 스레드로 여러 개의 가상 스레드를 실행할 수 있다.
- 기존의 스레드보다 가벼우면서도 유연한 스레드 모델을 제공하면, 스레드 생성 및 관리 비용이 낮아져서 대규모 동시성 작업에 적합하다.
- 가상 스레드는 ‘java.lang.Thread’ 클래스가 아니라 ‘java.lang.VirtualThread’ 클래스를 통해 생선된다.
- 다음과 같은 작업을 수행할 때, 가상 스레드가 추천된다.
- I/O 바운드 작업
- I/O 바운드 작업은 주로 입출력(I/O) 작업에 의해 제한되는 작업
- 예를 들어, 파일 읽기/쓰기, 네트워크 통신, 데이터베이스 조회 등이 I/O 바운드 작업에 해당
- 이러한 작업은 데이터를 읽거나 쓰는 등의 입출력 작업이 주로 발생하며, CPU 보다는 디스크나 네트워크 등의 I/O 장치의 성능에 의존한다.
- 따라서 CPU 의 성능이 높앋 I/O 작업이 느리면 전체 시스템의 성능이 저하될 수 있다. 이를 해결하기 위해 비동기적인 I/O 처리나 다중 스레드를 활용하는 등의 방법이 사용될 수 있다.
기존 스레드(Conventional Thread)
- 기존의 스레드는 운영 체제(OS) 의 네이티브 스레드와 1:1 대응된다. 즉, 각 Java 스레드는 운영 체제에서 별도의 스레드로 관리된다.
- 스레드당 할당되는 스택과 자원이 크기 때문에, 수백 개 이상의 스레드를 생성하는 것은 많은 메모리와 관리 비용이 들 수 있다.
- 동시성 처리를 위한 전통적인 방식으로, 여러 작업을 병렬로 처리하거나 동기화된 작업을 수행할 수 있다.
- ‘java.lang.Thread’ 클래스를 통해 생성되며, 운영 체제에서 스레드를 생성하고 관리한다.
- 다음과 같은 작업을 수행할 때, 기존 스레드가 추천된다.
- CPU 바운드 작업
- CPU 바운드 작업은 CPU 의 연산 능력이 주로 필요한 작업이다.
- 예를 들어, 복잡한 계산, 데이터 처리, 알고리즘 실행 등이 CPU 바운드 작업에 해당된다.
- 이러한 작업은 주로 CPU 의 성능에 의존하며, CPU 가 작업을 처리하는 동안 다른 하드웨어 리소스에는 크게 의존하지 않는다.
- 대부분의 경우, 멀티코어 프로세서를 활용하여 병렬 처리가 가능하며, 스레드 간의 작업 분배와 CPU 의 활용에 따라 성능을 극대화 할 수 있다.