인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

이북자님의 프로필 이미지

작성한 질문수

1시간만에 끝내는 virtual thread in spring boot

virtual thread in task execution

ThreadPoolTaskExecutor에서의 가상스레드

작성

·

28

0

안녕하세요! 너무 좋은 무료강의 감사합니다:)

강의를 듣는와중에 궁금증이 생겼는데요.

log.info("3) Service virtual true: {}", Thread.currentThread().isVirtual());

현재 스레드가 가상스레드가 맞는지 확인 하는 위와 같은 코드를 심어 실행해 보았습니다.

컨트롤러의 경우 항상 true를 리턴했고,

SimpleAsyncTaskExecutor의 경우에도 true를 리턴했습니다.

그러나 예제코드에서 세팅하신 ThreadPoolTaskExecutor의 설정으로는 false를 리턴하였습니다.

해당 현상을 gpt한테 100% 공식문서 기반으로 설명하라고 하자 ThreadPoolTaskExecutors는 VirtualThread와 상호작용 중이라는 힌트 정보를 붙인 것이다(?) 라는 답변을 하여 이해하기가 힘들었습니다.

일단

threadPoolTaskExecutor.setThreadFactory(Thread.ofVirtual().name("vthread-", 0).factory());

와 같은 ThreadPoolTaskExecutors의 세팅을 추가해주니 isVirtual 에대한 true값이 나오긴 했습니다.

제 부족한 견문으로는 이해가 되지 않는 현상이라 강사님이 도움을 주실수 있나해서 문의드립니다 🙂

답변 2

1

Hello World님의 프로필 이미지
Hello World
지식공유자

좋은 질문이네요.

 

SimpleAsyncTaskExecutor를 아래처럼 spring 에서 제공하는 builder 를 이용하지 않고 직접 만들면 virtual thread 를 사용하지 않습니다.

@Bean
public SimpleAsyncTaskExecutor taskExecutor(SimpleAsyncTaskExecutorBuilder builder) {
        return new SimpleAsyncTaskExecutor();
//        return builder.build();
}

아래처럼 virtual thread factory 를 설정해서 bean 을 만들었다면 virtual thread 로 동작합니다.

new SimpleAsyncTaskExecutor(factory);

결국, SimpleAsyncTaskExecutor 자체는 virtual thread 를 사용할수도 있고, 아닐수도 있습니다. 해당 객체를 생성할 때 어떤 설정을 했냐에 따라 달라지는 것이죠.

yml 에 virtual thread 를 사용하겠다고 설정을 해두었기에, spring 에서 만든 thread pool 관련 builder bean 들은 virtual thread 사용하는 설정이 되어 있어서, builder 를 통해 만들면 항상 virtual thread 를 사용합니다.

 

ThreadPoolTaskExecutor 의 경우에도 아래처럼 spring 이 만든 builder 를 통해 만든다면 virtual thread 를 사용합니다.

@Bean
public ThreadPoolTaskExecutor threadPoolTaskExecutor(ThreadPoolTaskExecutorBuilder builder) {
        return builder.build();
}

 

도움이 되셨길 바랍니다. :)

 

 

*주의할점은 task scheduler 도 내부적으로 thread pool 을 사용하므로 ,TaskExecutor 공부할때는 TaskScheduler 는 disable 해두고 공부하는게 좋습니다. ( 특정 상황에서 @Async 에서TaskExecutor 가 아닌 taskScheduler 의 thread pool 을 사용할 수 도 있는데 , 이 경우 처음 공부하는 입장에서는 상당히 혼란스럽게 느껴집니다.)

 

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. 이북자님.

질문해 주신 내용에 대해 설명드리겠습니다. Virtual Thread(가상 스레드)를 이용할 때, Thread.currentThread().isVirtual() 메소드를 호출하여 현재 실행 중인 스레드가 가상 스레드인지 확인할 수 있습니다.

  1. SimpleAsyncTaskExecutor를 사용할 때 true가 반환되는 이유는, SimpleAsyncTaskExecutor가 새로운 스레드를 생성할 때마다 기본적으로 가상 스레드를 선택하기 때문입니다. 이 때문에 가상 스레드를 생성 및 실행하여 true를 반환하는 것입니다.

  2. ThreadPoolTaskExecutor의 경우, 기본적으로 플랫폼 스레드를 사용합니다. 따라서 가상 스레드를 사용하도록 Thread.ofVirtual().factory()를 설정하지 않으면, false를 반환하게 됩니다.

이와 유사한 질문을 다룬 게시물 링크를 첨부합니다:
- 1강 성능비교 질문

해당 게시물에서는 Tomcat에서의 스레드 사용 예시를 통해, Virtual Thread의 성능 및 사용 방법에 대해 설명합니다. 이 내용은 ThreadPoolTaskExecutor의 설정 및 사용과도 밀접한 관련이 있어 도움이 될 수 있습니다.

추가적으로 Virtual Threads에 대한 더 깊이 있는 이해를 원하신다면, Oracle의 Virtual Threads 공식 가이드를 참조하실 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.