diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index 1b0454b..1cbccf3 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -68,6 +68,10 @@ user:
 spring:
   application:
     name: ${ruoyi.name}
+  threads:
+    # 启用JAVA21虚拟线程
+    virtual:
+      enabled: true
   # 资源信息
   messages:
     # 国际化资源文件路径
diff --git a/ruoyi-common/ruoyi-common-web/src/main/java/com/ruoyi/common/web/config/UndertowConfig.java b/ruoyi-common/ruoyi-common-web/src/main/java/com/ruoyi/common/web/config/UndertowConfig.java
index 6659c3c..eb79e08 100644
--- a/ruoyi-common/ruoyi-common-web/src/main/java/com/ruoyi/common/web/config/UndertowConfig.java
+++ b/ruoyi-common/ruoyi-common-web/src/main/java/com/ruoyi/common/web/config/UndertowConfig.java
@@ -1,11 +1,14 @@
 package com.ruoyi.common.web.config;
 
+import com.ruoyi.common.core.utils.SpringUtils;
 import io.undertow.server.DefaultByteBufferPool;
 import io.undertow.websockets.jsr.WebSocketDeploymentInfo;
 import org.springframework.boot.autoconfigure.AutoConfiguration;
 import org.springframework.boot.web.embedded.undertow.UndertowServletWebServerFactory;
 import org.springframework.boot.web.server.WebServerFactoryCustomizer;
 
+import java.util.concurrent.Executors;
+
 /**
  * Undertow 自定义配置
  *
@@ -24,6 +27,11 @@ public class UndertowConfig implements WebServerFactoryCustomizer<UndertowServle
             WebSocketDeploymentInfo webSocketDeploymentInfo = new WebSocketDeploymentInfo();
             webSocketDeploymentInfo.setBuffers(new DefaultByteBufferPool(false, 512));
             deploymentInfo.addServletContextAttribute("io.undertow.websockets.jsr.WebSocketDeploymentInfo", webSocketDeploymentInfo);
+            // 启用JAVA21虚拟线程
+            if (SpringUtils.getProperty("spring.threads.virtual.enabled", Boolean.class, false)) {
+                deploymentInfo.setExecutor(Executors.newVirtualThreadPerTaskExecutor());
+            }
+
         });
     }