Java의 가상 스레드

가상 스레드는 약속한 대로 동시성을 사용하기 쉽게 만듭니다.



변경 사항은 최소이며 클래식 ThreadPool 대신 newVirtualThreadPerTaskExecutor를 사용할 수 있습니다. 그게 다야!

이제 Java 19 덕분에 경량 동시성 모델(Kotlin의 코루틴과 유사)을 사용하여 처리량이 많은 애플리케이션을 만들 수 있습니다. 이것은 가상 스레드를 통해 수행됩니다.

Spring Boot는 이미 Java 19를 지원하지만 아직 미리 보기 모드이므로 인내심을 가져야 합니다.

데모 자바



https://github.com/jorgetovar/java-loom-project

차단 작업

    public Integer call() throws InterruptedException {
        Thread.sleep(1000);
        return number;
    }


1_000 차단 작업 처리

    public void process(String threadPoolType) throws InterruptedException, ExecutionException {

        try (ExecutorService executor = executorService) {
            List<Task> tasks = IntStream.range(0, 1_000)
                    .mapToObj(Task::new)
                    .collect(Collectors.toList());

            long time = System.currentTimeMillis();

            List<Future<Integer>> futures = executor.invokeAll(tasks);

            long sum = 0;
            for (Future<Integer> future : futures) {
                sum += future.get();
            }

            time = System.currentTimeMillis() - time;
            log.info("Result = {} ThreadPool sum: {} in {} ms", threadPoolType, sum, time);
            executor.shutdown();
        }
    }


Loom 및 Classic ThreadPool 태스크로 처리*

    @Override
    public void run(String... args) throws Exception {
        ExecutorService loom = Executors.newVirtualThreadPerTaskExecutor();
        ExecutorService classic = Executors.newFixedThreadPool(100);
        VirtualThreads virtualThreads = new VirtualThreads(classic);
        virtualThreads.process("classic");
        virtualThreads = new VirtualThreads(loom);
        virtualThreads.process("loom");
    }


산출

- : Started DemoApplication in 0.373 seconds (JVM running for 0.66)
- : Result = classic ThreadPool sum: 499500 in 10062 ms
- : Result = loom ThreadPool sum: 499500 in 1015 ms


데모 코틀린



코루틴

    measureTimeMillis {
        runBlocking {
            repeat(1_000) { i ->
                launch {
                    call(i)
                }
            }
        }
    }.also {
        print("Result = Coroutines finished in $it ms")
    }



산출

Result = Coroutines finished in 1064 ms


결론



Project Loom은 Java의 게임 체인저입니다. 이를 통해 개발자는 패러다임을 바꾸거나 현재 코드를 크게 변경하지 않고도 높은 동시 응용 프로그램을 만들 수 있습니다.

좋은 웹페이지 즐겨찾기