2024/06/23
-
Java Virtual Thread (9), Spring Boot에서 Virtual Thread 사용하기카테고리 없음 2024. 6. 23. 16:25
spring: output: ansi: enabled: ALWAYS threads: virtual: enabled: true task: scheduling: thread-name-prefix: mySch- yml 파일에 spring.thread.virtual.enavled = true 로 설정해주면 스프링이 기존 thread pool 의 동작을 모두 virtual thread pool 로 대체해준다. RestController 에서 사용하는 Tomcat의 Thread가 어떻게 Virtual Thread로 동작하는지 살펴보자.@GetMapping("/sleep")public void sleep() throws InterruptedException { ..
-
Java Virtual Thread (8), Virtual Thread와 Platform Thread 성능비교프로그래밍/Java 2024. 6. 23. 15:33
1) IO 바운드 작업 비교 private static final Runnable ioBoundRunnable = new Runnable() { @Override public void run() { log.info("1) run. thread: " + Thread.currentThread()); try { Thread.sleep(5000); } catch (InterruptedException e) { throw new RuntimeException(e); } log.info("2) run. thread: " + Thread.currentThread()); }};private static..
-
Java Virtual Thread (7), Virtual Thread Dump프로그래밍/Java 2024. 6. 23. 15:04
기본적으로 인텔리제이에서는 Thread Dump와 비슷한 기능을 제공하고 있다. 현재 인텔리제이에서는 디버그 모드를 통해 Virtual Thread가 몇개 떠 있는지 정확하게 알 수 없다. (2024.01 버전 기준) @Slf4j// jcmd Thread.dump_to_file -format=text public class VirtualThreadDump { private static final Runnable runnable = new Runnable() { @Override public void run() { log.info("1) run. thread: " + Thread.currentThread()); try { ..
-
Java Virtual Thread (6), Reentrant을 이용한 Pinned Virtual Thread 방지카테고리 없음 2024. 6. 23. 14:48
private final ReentrantLock lock = new ReentrantLock(); private final Runnable runnable = new Runnable() { @Override public void run() { //synchronized (this) { lock.lock(); try { Thread.sleep(5000); } catch (InterruptedException e) { throw new RuntimeException(e); } finally { loc..
-
Java Virtual Thread (5), Pinned Virtual Thread프로그래밍/Java 2024. 6. 23. 14:17
Pinned Virtual Thread를 직역하면 고정된 가상 스레드이다. Virtual Thread는 blocking 작업이 되면(blocking 메서드를 호출하면) 플랫폼 스레드가 언마운트되고 다른 Virtual Thread가 플랫폼 스레드를 사용함으로써 효율은 높이는 방식인데 그것을 못하게 하는 것이 Pinned Virtual Thread 이다. 즉, virtual thread 는 Synchronized block 혹은 Native 메서드와 함께 사용하는 것은 피해야한다. 1) Native 메서드 Object 클래스를 보면 hascode 라는 메서드가 있다. 이는 native로 설정이 되어 있으며 body 값이 없다. native 로 적혀져 있는 것은 c, c++ 같은 native 언어로 ..
-
Java Virtual Thread (4), ForkJoinPool카테고리 없음 2024. 6. 23. 13:29
ForkJoinPool은 이미 Java에 구현되어 있는 클래스이다. (Java1.7부터 지원) 예제를 하나 살펴보자. List에 들어있는 숫자 중 짝수를 필터링하고 값 하나를 가져오는 예제이다.@Slf4jpublic class ForkJoinPoolTest { public static void main(String[] args) { List list = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); Optional op = list.stream() .filter(item -> { boolean isEven = item % 2 == 0; return i..