Controller.java
@GetMapping("/async")
public void async() {
log.info("1) async. thread: {}", Thread.currentThread());
virtualService.async();
log.info("2) async. thread: {}", Thread.currentThread());
}
Service.java
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
@Service
@Slf4j
public class VirtualService {
@Async("threadPoolTaskExecutor")
public void async() {
log.info("1) async. thread: {}", Thread.currentThread());
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
log.info("2) async. thread: {}", Thread.currentThread());
}
}
@Async 어노테이션에서 Virtual Thread가 잘 동작하는지 확인해보자.
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
@EnableAsync
@SpringBootApplication
public class VirtualthreadApplication {
public static void main(String[] args) {
SpringApplication.run(VirtualthreadApplication.class, args);
}
}
Spring에서 비동기로 제일 쉽게 하는 것이 @Async이다. 그리고 @Async 를 사용할 땐 @EnableAsync를 적어줘야 한다.
위 코드를 실행해보면, 컨트롤러에서는 Tomcat handler-0 이라는 스레드가 virtual thread가 사용되었다. 그리고 서비스에서는 task1 이라고하는 virtual thread가 사용된 것을 알 수 있다.
즉, 컨트롤러에서는 tomcat handler-0, @async가 선언된 서비스에서는 task 1이라고 하는 virtual thread가 사용된 것이다. 원래는 thread pool 에 있는 것을 자동으로 사용했다면, 이제는 virtual thread가 적용되는 것이다.
...
정리
1) spring 에서 사용하는 @async 에도 virtual thread 가 적용된다.
2) 컨트롤러에서는 tomcat handler-0 이라는 virtual thread 가 호출되며 @async가 선언된 구문에서는 task 1 이라는 virtual thread가 호출된다.
3) 만약 virtual thread를 적용하지 않았다면 자동으로 thread pool을 사용했을 것이다.
'프로그래밍 > Java' 카테고리의 다른 글
Java Virtual Thread (12), custom Executor, Scheduler (0) | 2024.06.29 |
---|---|
Java Virtual Thread (11), @scheduled 어노테이션 (0) | 2024.06.29 |
Java Virtual Thread (8), Virtual Thread와 Platform Thread 성능비교 (0) | 2024.06.23 |
Java Virtual Thread (7), Virtual Thread Dump (0) | 2024.06.23 |
Java Virtual Thread (5), Pinned Virtual Thread (0) | 2024.06.23 |