Виртуальный поток (виртуальный поток), также известный как сопрограмма или волокно, представляет собой облегченную реализацию потока. По сравнению с традиционными потоками и потоками уровня операционной системы (также называемыми потоками платформы), его накладные расходы на создание меньше, более высокое использование ресурсов и более эффективное использование ресурсов. важное нововведение в области параллельного программирования на Java.
PS: Виртуальные потоки официально выпущены в версии Java Long Term Support (LTS) Java 21 (также известной как JDK 21).
Виртуальный поток — это логический поток, реализованный на уровне виртуальной машины Java (JVM) и не соответствующий напрямую физическим потокам операционной системы. Следовательно, он может снизить затраты на производительность, вызванные переключением контекста.
Взаимосвязь между потоками операционной системы, обычными потоками (потоками Java) и виртуальными потоками следующая:
Существует четыре способа создания виртуального потока:
Конкретное использование заключается в следующем.
Создайте виртуальный поток и напрямую запустите задачу выполнения:
// Создать и запустить виртуальный поток
Thread.startVirtualThread(() -> {
System.out.println("Do virtual thread.");
});
Создавать только виртуальный поток, но не запускать его напрямую (запускать через старт после создания):
// Создать виртуальный поток
Thread vt = Thread.ofVirtual().unstarted(()->{
System.out.println("Do virtual thread.");
});
// Запустить виртуальный поток
vt.start();
Сначала создайте фабрику виртуальных потоков, затем используйте фабрику для создания виртуального потока, а затем вызовите метод start() для выполнения:
// Создать виртуальный потоковый завод
ThreadFactory tf = Thread.ofVirtual().factory();
// Создать виртуальный поток
Thread vt = tf.newThread(()->{
System.out.println("Do virtual thread.");
});
// Запустить виртуальный поток
vt.start();
Создайте пул виртуальных потоков:
// Создайте пул потоков, поддерживающий виртуальные потоки.
ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();
executor.submit(()->{
System.out.println("Do virtual thread.");
});
Разница между виртуальными потоками и обычными потоками в основном отражается в следующих моментах:
Если приведенная выше конфигурация не вступит в силу, вы также можете изменить класс конфигурации Tomcat, чтобы использовать виртуальные потоки для обработки каждого запроса. Код конфигурации выглядит следующим образом:
import java.util.concurrent.Executors;
import org.springframework.boot.web.embedded.tomcat.TomcatProtocolHandlerCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class TomcatConfiguration {
@Bean
public TomcatProtocolHandlerCustomizer<?> protocolHandlerVirtualThreadExecutorCustomizer() {
return protocolHandler -> {
// Используйте виртуальные потоки для обработки каждого запроса
protocolHandler.setExecutor(Executors.newVirtualThreadPerTaskExecutor());
};
}
}
Если вы хотите настроить виртуальные потоки для асинхронных задач @Async в Spring Boot, вы можете установить это в классе конфигурации AsyncConfigurer. Код конфигурации выглядит следующим образом:
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.support.TaskExecutorAdapter;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
@Configuration
@EnableAsync // Включить асинхронные задачи
public class AsyncTaskConfiguration implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {
return new TaskExecutorAdapter(Executors.newThreadPerTaskExecutor(Thread.ofVirtual().name("virtual-async#", 1).factory()));
}
}
Поговорим о базовой реализации виртуальных потоков? Нужен ли мне пул виртуальных потоков после наличия виртуальных потоков? Почему?
Эта статья была включена на мой сайт интервью. www.javacn.site,Включенное содержимое: Redis, JVM, одновременно, одновременно, MySQL, Spring, Spring. MVC、Spring Boot、Spring Облако, MyBatis, шаблоны проектирования, очередь сообщений и другие модули.