java

layout: part03 title: “14.10 가상 스레드” nav_order: 10 parent: “Chapter 20. 멀티 스레드” grand_parent: “Part 03. 라이브러리 활용” —

21.6 가상 스레드

자바 21부터 사용할 수 있는 기능 중 가장 주목해야 할 것은 가상(Virtual) 스레드이다. 가상 스레드는 처리량이 높은 동시 애플리케이션을 개발할 때 사용할 수 있는 경량(Lightweight) 스레드이다.

가상 스레드 개요

지금까지 자바 개발자들은 서버 애플리케이션에서 사용자 요청을 동시에 처리(요청별 스레드)하기 위해 스레드 풀링을 사용했다. 자바 17까지의 스레드는 운영체제가 제공하는 플랫폼(Platform) 스레드를 래핑했기 때문에 스레드와 플랫폼 스레드가 1:1로 매핑되었다. 플랫폼 스레드는 비용이 많이 들기 때문에 애플리케이션은 스레드의 수를 제한해서 사용해야 했었다.

이러한 단점을 해결하기 위해 자바 21에서는 CPU를 효율적으로 이용하면서 동시 처리량을 확장할 수 있도록 가상 스레드를 제공한다. 스레드가 플랫폼 스레드와 1:1로 매핑된다면 가상 스레드는 플랫폼 스레드와 n:1로 매핑된다. 다수의 가상 스레드가 한 개의 플랫폼 스레드와 매핑되기 때문에 플랫폼 스레드의 부족 문제를 해결할 수 있게 된다.

가상 스레드는 CPU에서 계산을 수행하는 동안만 플랫폼 스레드를 사용한다. 가상 스레드가 블로킹 I/O 작업(파일 입출력, 네트워킹)을 수행할 경우 가상 스레드는 일시 중지되지만, 플랫폼 스레드는 일시 중지되지 않고 다른 가상 스레드의 작업을 처리한다. 그렇기 때문에 CPU 활용도는 최적으로 끌어올리면서 높은 동시 처리량을 달성할 수 있다.

참고: 자바 API 도큐먼트에서는 자바 21 이전까지의 일반적인 스레드(Thread)를 플랫폼 스레드라고 부른다.

가상 스레드풀 생성

가상 스레드는 메모리가 부족하지 않다면 개수를 무제한으로 사용할 수 있기 때문에 스레드풀에서 최대 개수를 제한할 필요가 없다. 실제로 가상 스레드풀을 생성하는 Executors의 메소드는 최대 개수를 입력받지 않는다.

가상 스레드는 스레드풀에서 풀링되어서는 안 되고, 작업 건수별로 새로운 가상 스레드를 생성해서 처리해야 한다.

가상 스레드 생성

자바 21부터는 가상 스레드를 생성하기 위해 새로운 정적 메소드 2개가 추가되었다.

// 방법 1
Thread.startVirtualThread(() -> {
    // 작업 내용
});

// 방법 2
Thread.ofVirtual().start(() -> {
    // 작업 내용
});

플랫폼 스레드 생성

자바 21부터는 플랫폼 스레드를 생성하는 또 다른 방법으로, Thread 클래스에 ofPlatform() 정적 메소드가 추가되었다.

Thread.ofPlatform().start(() -> {
    // 작업 내용
});