Skip links

자바 플랫폼의 가상 쓰레드 지원

요청당 쓰레드를 생성하는 어플리케이션에 최적화

기존 쓰레드 API에 최소한의 변경으로 가상 쓰레드 사용 기능

기존 JDK 도구를 사용하여 디버깅 및 프로 파일링 제공

 

 

JDK 21(LTS) 버전에서 가상 쓰레드가 도입됩니다.

가상 쓰레드는 동시 처리량이 많은 어플리케이션 작성 및 유지보수를 쉽게 할 수 있도록 하는 경량 쓰레드입니다.

 

서버에서 대용량 작업을 동시에 처리하기 위해서 이전에는 프로세스 Fork 방식과 쓰레드 방식, 이벤트 방식을 사용했습니다. 프로세스 Fork 방식은 요청 마다 하나의 프로세스를 생성해서 작업을 처리 합니다.

프로세스 생성은 운영체제 입장에서는 비용이 많이 드는 작업이며 생성할 수 있는 개수에도 제한이 있습니다.

쓰레드 방식은 하나의 프로세스에서 공유 된다는 점과 프로세스 Fork 방식에 비해 가볍지만 여전히 OS 스레드에 종속되어 있어 생성 개수에 제한이 있습니다.

마지막으로 이벤트 방식은 논-블로킹 IO을 사용하여 IO작업이 지연/대기중일때 다른 작업을 처리하고 대기중인 작업이 완료되면 이전 작업 중지 시점부터 코드를 수행하는 방식입니다.

Fork, 쓰레드 방식과 비교하여 작업이 대기 상태로 빠질 경우 바로 다른 작업을 수행하기 때문에 처리량은 높지만 구현하기가 쉽지가 않습니다.

 

서버응용 프로그램은 일반적으로 동시에 여러 사용자 요청을 처리해야 합니다.

이를 위해 기존 Fork 방식과 쓰레드 방식은 동시에 처리할 수 있는 처리량이 지극히 제한적입니다.

이에 비해 가상 쓰레드는 OS 쓰레드마다 여러 가상 쓰레드를 구동하는 방식으로 하드웨어 리소스를 최대한까지 사용할 수 있습니다. 그리고 기존 쓰레드 코드를 거의 수정없이 사용할 수 있어 학습 난의도가 낮고 처리량은 대폭으로 향상 됩니다. 이러한 특성을 이해하고 활용하여 웹서버나 API서버에 적용하면 기존 방식대비 높은 처리량을 보이게 됩니다.

 

이전의 쓰레드 방식은 쓰레드 생성에 드는 비용을 최소화하기 위해 쓰레드 풀을 사용했지만 가상 쓰레드는 비용이 많이 들지 않기 때문에 풀을 만들어 사용할 필요가 없습니다.

그리고 데이터베이스 연결과 같이 외부 동시접속 제한이 있거나 연결을 만드는데 비용이 드는 경우도 스레드 풀로 해결하지 말고 별도 세마포어를 사용하여 관리 하는게 좋습니다.

가상 쓰레드는 JDK 19버전부터 추가 되기 시작하여 9월에 릴리즈 되는 차기 LTS 버전인 JDK 21에서 완료될 예정입니다.