1. 什麼是虛擬線程 虛擬線程是JDK21版本正式發佈的一個新特性。虛擬線程和平臺線程主要區別在於,虛擬線程在運行周期內不依賴操作系統線程:它們與硬體脫鉤,因此被稱為“虛擬”。這種解耦是由JVM提供的抽象層賦予的。 虛擬線程的運行成本遠低於平臺線程。它們消耗的記憶體要少得多。這就是為什麼我們可以創建數 ...
1. 什麼是虛擬線程
虛擬線程是JDK21版本正式發佈的一個新特性。虛擬線程和平臺線程主要區別在於,虛擬線程在運行周期內不依賴操作系統線程:它們與硬體脫鉤,因此被稱為“虛擬”。這種解耦是由JVM提供的抽象層賦予的。
虛擬線程的運行成本遠低於平臺線程。它們消耗的記憶體要少得多。這就是為什麼我們可以創建數百萬個虛擬線程而不會出現記憶體不足的問題,而標準平臺(或內核)線程只能創建數百個。
因此,我們可以無需依賴非同步代碼即可管理高度可擴展的應用程式。
2. 代碼實戰
在SpringBoot項目中創建MyThreadConfig
類
@EnableAsync
@Configuration
public class MyThreadConfig {
@Bean
public AsyncTaskExecutor applicationTaskExecutor() {
return new TaskExecutorAdapter(Executors.newVirtualThreadPerTaskExecutor());
}
@Bean
public TomcatProtocolHandlerCustomizer<?> protocolHandlerVirtualThreadExecutorCustomizer() {
return protocolHandler -> {
protocolHandler.setExecutor(Executors.newVirtualThreadPerTaskExecutor());
};
}
}
上述代碼主要是將SpringBoot內置的線程池修改為虛擬線程。第一個Spring Bean(ApplicationTaskExecutor
)將取代標準的ApplicationTaskExecutor
,提供一個 Executor
,為每個任務啟動一個新的虛擬線程。第二個 Bean 命名為 ProtocolHandlerVirtualThreadExecutorCustomizer
,它將以同樣的方式定製標準的 TomcatProtocolHandler
3. 總結
項目改用虛擬線程後,HTTP請求降低30%的耗時,用戶體驗更佳。