Usare i virtual threads in Java e Spring Boot

Mattepuffo's logo
Usare i virtual threads in Java e Spring Boot

Usare i virtual threads in Java e Spring Boot

Parecchio tempo fa scrissi un articolo sull'uso dei virtual threads in Java.

In questo articolo andremo ad usare, più o meno, quel codice per fare dei test in Spring Boot.

La prima cosa che dobbiamo fare è attivarli.

Dentro il nostro application.properties aggiungiamo queste due righe:

spring.threads.virtual.enabled=true
server.tomcat.threads.max=200

Poi dobbiamo modificare anche l'entry point; o volendo possiamo mettere questo codice in una classe apposita, questo dipende da voi:

package com.example.test_springboot_java;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.embedded.tomcat.TomcatProtocolHandlerCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.core.task.AsyncTaskExecutor;
import org.springframework.core.task.support.TaskExecutorAdapter;

import java.util.concurrent.Executors;

@SpringBootApplication
public class TestSpringbootJavaApplication {

  public static void main(String[] args) {
    SpringApplication.run(TestSpringbootJavaApplication.class, args);
  }

  @Bean
  TomcatProtocolHandlerCustomizer<?> protocolHandlerVirtualThreadsCustomizer() {
    return protocolHandler ->
        protocolHandler.setExecutor(Executors.newVirtualThreadPerTaskExecutor());
  }

  @Bean
  public AsyncTaskExecutor asyncTaskExecutor() {
    return new TaskExecutorAdapter(Executors.newVirtualThreadPerTaskExecutor());
  }

}

Infine il controller:

package com.example.test_springboot_java.controllers;

import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

import java.util.Random;

@RestController
@RequestMapping(path = "/test")
public class TestController {

  @GetMapping(path = "/", produces = MediaType.APPLICATION_JSON_VALUE)
  @ResponseStatus(HttpStatus.OK)
  public String index() {
    long start = System.currentTimeMillis();

    Random random = new Random();
    Runnable runnable = () -> {
      double d = random.nextDouble(1000) % random.nextDouble(1000);
    };

    for (int i = 0; i < 50000; i++) {
      Thread.startVirtualThread(runnable);
    }

    long finish = System.currentTimeMillis();
    long timeElapsed = finish - start;

    return Thread.currentThread() + "n" + "TEMPO DI ESECUZIONE: " + timeElapsed;
  }

}

Che sostanzialmente ci ritorna una stringa con:

  • una prima parte che ci dice se i virtual threads sono attivi
  • una seconda parte con il risultato delle operazioni

Enjoy!


Condividi

Commentami!