ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 {
                    lock.unlock();
                }
                //}
            }
        };

     

    Reentrant 클래스는 Java에서 제공되는 클래스이다. 이를 이용해 synchronized lock 을 대체할 수 있다. 

     

    public static void main(String[] args) {
        long startTime = System.currentTimeMillis();
        log.info("1) main. thread: " + Thread.currentThread());
    
        platform();
        //virtual();
    
        log.info("2) main. time: " + (System.currentTimeMillis()-startTime) + " , thread: " + Thread.currentThread());
    }
    
    private static void virtual() {
        ThreadFactory factory = Thread.ofVirtual().name("myVirtual-", 0).factory();
        try (ExecutorService executorService = Executors.newThreadPerTaskExecutor(factory)) {
            for (int i = 0; i < 20; i++) {
                Pinning pinning = new Pinning();
                executorService.submit(pinning.runnable);
            }
        }
    }
    
    private static void platform() {
        try (ExecutorService executorService = Executors.newFixedThreadPool(20)) {
            for (int i = 0; i < 20; i++) {
                Pinning pinning = new Pinning();
                executorService.submit(pinning.runnable);
            }
        }
    }

     

    수행 시간을 확인해보면 platform thread와 virtual thread가 동일한 수행시간을 가지는 것을 확인할 수 있다.

     

     

     

    synchronized lock 대신 Reentrant lock 을 사용하면 virtual thread의 효용성을 그대로 살릴 수 있다.

Designed by Tistory.