虚拟线程池

性能对比示例 复制代码
/**
 * 性能对比测试
 */
@Service
public class ThreadPerformanceService {
    
    /**
     * 传统线程池测试
     */
    @Async("taskExecutor")
    public CompletableFuture<String> traditionalAsync(String taskId) {
        // 模拟IO密集型任务(如数据库查询、HTTP请求)
        try {
            Thread.sleep(100); // 模拟100ms的IO等待
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        return CompletableFuture.completedFuture("传统线程-" + taskId);
    }
    
    /**
     * 虚拟线程测试
     */
    @Async("virtualThreadTaskExecutor")
    public CompletableFuture<String> virtualAsync(String taskId) {
        // 同样的IO密集型任务
        try {
            Thread.sleep(100); // 模拟100ms的IO等待
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        return CompletableFuture.completedFuture("虚拟线程-" + taskId);
    }
    
    /**
     * 并发测试:1000个任务
     */
    public void performanceTest() {
        long startTime = System.currentTimeMillis();
        
        // 使用传统线程池
        List<CompletableFuture<String>> traditionalTasks = new ArrayList<>();
        for (int i = 0; i < 1000; i++) {
            traditionalTasks.add(traditionalAsync("task-" + i));
        }
        CompletableFuture.allOf(traditionalTasks.toArray(new CompletableFuture[0])).join();
        
        long traditionalTime = System.currentTimeMillis() - startTime;
        System.out.println("传统线程池耗时: " + traditionalTime + "ms");
        
        // 使用虚拟线程池
        startTime = System.currentTimeMillis();
        List<CompletableFuture<String>> virtualTasks = new ArrayList<>();
        for (int i = 0; i < 1000; i++) {
            virtualTasks.add(virtualAsync("task-" + i));
        }
        CompletableFuture.allOf(virtualTasks.toArray(new CompletableFuture[0])).join();
        
        long virtualTime = System.currentTimeMillis() - startTime;
        System.out.println("虚拟线程池耗时: " + virtualTime + "ms");
        
        // 结果:虚拟线程池通常比传统线程池快 3-10 倍
    }
}

🏗️ 虚拟线程的工作原理

csharp 复制代码
/**
 * 虚拟线程工作原理演示
 */
public class VirtualThreadDemo {
    
    public static void main(String[] args) {
        // 创建虚拟线程
        Thread virtualThread = Thread.ofVirtual()
                .name("virtual-", 0)
                .start(() -> {
                    System.out.println("虚拟线程名称: " + Thread.currentThread().getName());
                    System.out.println("是否为虚拟线程: " + Thread.currentThread().isVirtual());
                    
                    // 模拟IO操作
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        Thread.currentThread().interrupt();
                    }
                    
                    System.out.println("虚拟线程执行完成");
                });
        
        try {
            virtualThread.join();
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
    }
}

✅ 非常适合虚拟线程的场景

typescript 复制代码
/**
 * 虚拟线程最佳实践场景
 */
@Service
public class VirtualThreadBestPractices {
    
    /**
     * 1. IO密集型任务 - 数据库查询
     */
    @Async("virtualThreadTaskExecutor")
    public CompletableFuture<List<User>> queryUsersAsync(List<Long> userIds) {
        // 数据库查询是IO密集型,虚拟线程优势明显
        List<User> users = userMapper.selectBatchIds(userIds);
        return CompletableFuture.completedFuture(users);
    }
    
    /**
     * 2. HTTP请求调用
     */
    @Async("virtualThreadTaskExecutor")
    public CompletableFuture<String> callExternalApiAsync(String url) {
        // HTTP请求是IO密集型,虚拟线程可以处理大量并发请求
        RestTemplate restTemplate = new RestTemplate();
        String result = restTemplate.getForObject(url, String.class);
        return CompletableFuture.completedFuture(result);
    }
    
    /**
     * 3. 文件IO操作
     */
    @Async("virtualThreadTaskExecutor")
    public CompletableFuture<String> readFileAsync(String filePath) {
        try {
            String content = Files.readString(Paths.get(filePath));
            return CompletableFuture.completedFuture(content);
        } catch (IOException e) {
            return CompletableFuture.failedFuture(e);
        }
    }
    
    /**
     * 4. 消息队列处理
     */
    @Async("virtualThreadTaskExecutor")
    public CompletableFuture<Void> processMessageAsync(String message) {
        // 消息处理通常涉及IO操作,适合虚拟线程
        messageService.processMessage(message);
        return CompletableFuture.completedFuture(null);
    }
}

❌ 不适合虚拟线程的场景

java 复制代码
/**
 * 不适合虚拟线程的场景
 */
@Service
public class VirtualThreadLimitations {
    
    /**
     * CPU密集型任务 - 不适合虚拟线程
     */
    @Async("taskExecutor") // 使用传统线程池
    public CompletableFuture<BigInteger> calculateFactorialAsync(int n) {
        // CPU密集型计算,传统线程池更合适
        BigInteger result = BigInteger.ONE;
        for (int i = 2; i <= n; i++) {
            result = result.multiply(BigInteger.valueOf(i));
        }
        return CompletableFuture.completedFuture(result);
    }
    
    /**
     * 同步锁竞争 - 不适合虚拟线程
     */
    private final Object lock = new Object();
    
    @Async("taskExecutor") // 使用传统线程池
    public CompletableFuture<String> synchronizedTaskAsync() {
        synchronized (lock) {
            // 同步代码块会阻塞载体线程,影响其他虚拟线程
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
            return CompletableFuture.completedFuture("完成");
        }
    }
}

🎯 最佳实践建议

typescript 复制代码
/**
 * 虚拟线程使用最佳实践
 */
@Configuration
public class VirtualThreadBestPractices {
    
    /**
     * 1. 混合使用策略
     */
    @Bean("virtualThreadTaskExecutor")
    public VirtualThreadTaskExecutor virtualThreadTaskExecutor() {
        // IO密集型任务使用虚拟线程
        return new VirtualThreadTaskExecutor("io-");
    }
    
    @Bean("cpuThreadTaskExecutor")
    public ThreadPoolTaskExecutor cpuThreadTaskExecutor() {
        // CPU密集型任务使用传统线程池
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(Runtime.getRuntime().availableProcessors());
        executor.setMaxPoolSize(Runtime.getRuntime().availableProcessors() * 2);
        executor.setThreadNamePrefix("cpu-");
        return executor;
    }
    
    /**
     * 2. 根据任务类型选择执行器
     */
    @Service
    public class TaskService {
        
        // IO密集型任务
        @Async("virtualThreadTaskExecutor")
        public CompletableFuture<String> ioIntensiveTask() {
            // 数据库查询、HTTP请求、文件IO等
            return CompletableFuture.completedFuture("IO任务完成");
        }
        
        // CPU密集型任务
        @Async("cpuThreadTaskExecutor")
        public CompletableFuture<String> cpuIntensiveTask() {
            // 复杂计算、数据处理等
            return CompletableFuture.completedFuture("CPU任务完成");
        }
    }
}
相关推荐
计算机毕设VX:Fegn08952 分钟前
计算机毕业设计|基于springboot + vue汽车销售系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·汽车·课程设计
聆风吟º19 分钟前
【Spring Boot 报错已解决】Spring Boot项目启动报错 “Main method not found“ 的全面分析与解决方案
android·spring boot·后端
Rover.x22 分钟前
Arthas内存泄露排查
java·后端
艺杯羹25 分钟前
掌握Spring Boot配置艺术:从YAML基础到实战进阶
java·spring boot·后端·yaml
喵叔哟26 分钟前
12.云平台部署
后端·.netcore
rannn_1111 小时前
【SQL题解】力扣高频 SQL 50题|DAY1
后端·sql·题解
IT_陈寒1 小时前
JavaScript性能优化:7个V8引擎内部原理帮你减少90%内存泄漏的实战技巧
前端·人工智能·后端
JaguarJack1 小时前
当遇见 CatchAdmin V5-模块化设计重新定义 Laravel 后台开发
后端·php
Qiuner1 小时前
Spring Boot AOP(三) 通知执行链源码解析
java·spring boot·后端
羑悻的小杀马特1 小时前
【Linux篇章】再续传输层协议TCP:用技术隐喻重构网络世界的底层逻辑,用算法演绎‘网络因果律’的终极推演(通俗理解TCP协议,这一篇就够了)!
linux·网络·后端·tcp/ip·tcp协议