news 2026/10/23 2:08:03

虚拟线程在Web应用中的应用:实战案例

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
虚拟线程在Web应用中的应用:实战案例

在前面的内容中,我们对JDK 21虚拟线程有了一定的理论认识。那么在实际的Web应用开发场景里,虚拟线程又能发挥怎样的作用呢?这正是本节要探讨的内容。我们将通过一个具体的Spring Boot项目代码示例,来演示虚拟线程在Web请求处理中的应用。通过这个案例,你不仅能学会如何在Web应用中使用虚拟线程提升并发处理能力,还能解决Web应用中虚拟线程使用的并发安全问题,最终让你能够在Web应用开发中熟练应用虚拟线程。

目录

      • 实战项目概述
      • 项目环境搭建
      • 代码实现
        • 控制器层
        • 主应用类
      • 并发处理能力测试
        • 配置JMeter
        • 运行测试
      • 并发安全问题解决
        • 示例问题
        • 解决方案
          • 使用`synchronized`关键字
          • 使用`AtomicInteger`
      • 总结
  • 🍃 系列专栏导航

实战项目概述

我们要构建一个简单的Spring Boot Web应用,该应用的主要功能是处理用户的请求,并模拟一些耗时的业务逻辑。在传统的Web应用中,处理大量并发请求时可能会遇到性能瓶颈,而我们将引入虚拟线程来提升应用的并发处理能力。

项目环境搭建

首先,我们需要搭建一个基本的Spring Boot项目。可以使用Spring Initializr(https://start.spring.io/ )来快速创建项目,选择以下依赖:

  • Spring Web:用于构建Web应用。
  • Spring Boot DevTools:提供开发时的便利功能。

创建好项目后,我们可以使用IDE(如IntelliJ IDEA)打开项目。

代码实现

控制器层

在src/main/java/com/example/demo目录下创建一个controller包,并在该包下创建一个UserController类,代码如下:

packagecom.example.demo.controller;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;@RestController@RequestMapping("/users")publicclassUserController{// 创建一个虚拟线程的执行器服务privatefinalExecutorServiceexecutorService=Executors.newVirtualThreadPerTaskExecutor();@GetMapping("/info")publicStringgetUserInfo(){// 提交一个任务到虚拟线程执行器服务returnexecutorService.submit(()->{// 模拟耗时的业务逻辑try{Thread.sleep(1000);}catch(InterruptedExceptione){Thread.currentThread().interrupt();}return"User information";}).get();}}

在上述代码中,我们创建了一个UserController类,其中包含一个getUserInfo方法,该方法处理/users/info的GET请求。在方法内部,我们使用Executors.newVirtualThreadPerTaskExecutor()创建了一个虚拟线程的执行器服务,并将一个模拟耗时业务逻辑的任务提交到该服务中执行。

主应用类

在src/main/java/com/example/demo目录下有一个自动生成的主应用类DemoApplication,代码如下:

packagecom.example.demo;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublicclassDemoApplication{publicstaticvoidmain(String[]args){SpringApplication.run(DemoApplication.class,args);}}

这个类是Spring Boot应用的入口点,启动该类即可启动我们的Web应用。

并发处理能力测试

为了验证虚拟线程对并发处理能力的提升,我们可以使用工具(如Apache JMeter)进行并发测试。

配置JMeter
  • 打开JMeter,创建一个新的测试计划。
  • 添加一个线程组,设置线程数(如1000)、循环次数(如1)等参数。
  • 添加一个HTTP请求默认值,设置服务器名称或IP(如localhost)、端口号(如8080)。
  • 添加一个HTTP请求,设置路径为/users/info。
  • 添加一个聚合报告监听器,用于查看测试结果。
运行测试

启动Spring Boot应用,然后运行JMeter测试计划。观察聚合报告中的各项指标,如吞吐量、平均响应时间等。

通过测试,我们可以发现使用虚拟线程后,应用的并发处理能力有了显著提升,能够在短时间内处理更多的请求。

并发安全问题解决

在使用虚拟线程时,我们还需要注意并发安全问题。例如,多个虚拟线程可能会同时访问和修改共享资源,导致数据不一致的问题。

示例问题

假设我们有一个共享的计数器,多个虚拟线程可能会同时对其进行递增操作,代码如下:

packagecom.example.demo;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;publicclassSharedCounter{privateintcount=0;publicvoidincrement(){count++;}publicintgetCount(){returncount;}publicstaticvoidmain(String[]args)throwsInterruptedException{SharedCountercounter=newSharedCounter();ExecutorServiceexecutorService=Executors.newVirtualThreadPerTaskExecutor();// 提交1000个任务到虚拟线程执行器服务for(inti=0;i<1000;i++){executorService.submit(counter::increment);}// 关闭执行器服务executorService.shutdown();executorService.awaitTermination(1,java.util.concurrent.TimeUnit.MINUTES);System.out.println("Final count: "+counter.getCount());}}

在上述代码中,我们创建了一个SharedCounter类,其中包含一个共享的计数器count。多个虚拟线程同时调用increment方法对计数器进行递增操作,由于count++不是原子操作,可能会导致数据不一致的问题。

解决方案

为了解决并发安全问题,我们可以使用同步机制(如synchronized关键字)或原子类(如AtomicInteger)。

使用synchronized关键字
packagecom.example.demo;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;publicclassSynchronizedCounter{privateintcount=0;// 使用synchronized关键字保证线程安全publicsynchronizedvoidincrement(){count++;}publicintgetCount(){returncount;}publicstaticvoidmain(String[]args)throwsInterruptedException{SynchronizedCountercounter=newSynchronizedCounter();ExecutorServiceexecutorService=Executors.newVirtualThreadPerTaskExecutor();// 提交1000个任务到虚拟线程执行器服务for(inti=0;i<1000;i++){executorService.submit(counter::increment);}// 关闭执行器服务executorService.shutdown();executorService.awaitTermination(1,java.util.concurrent.TimeUnit.MINUTES);System.out.println("Final count: "+counter.getCount());}}

在上述代码中,我们使用synchronized关键字修饰increment方法,保证同一时间只有一个线程可以访问该方法,从而解决了并发安全问题。

使用AtomicInteger
packagecom.example.demo;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;importjava.util.concurrent.atomic.AtomicInteger;publicclassAtomicCounter{privatefinalAtomicIntegercount=newAtomicInteger(0);publicvoidincrement(){// 使用AtomicInteger的incrementAndGet方法保证原子性count.incrementAndGet();}publicintgetCount(){returncount.get();}publicstaticvoidmain(String[]args)throwsInterruptedException{AtomicCountercounter=newAtomicCounter();ExecutorServiceexecutorService=Executors.newVirtualThreadPerTaskExecutor();// 提交1000个任务到虚拟线程执行器服务for(inti=0;i<1000;i++){executorService.submit(counter::increment);}// 关闭执行器服务executorService.shutdown();executorService.awaitTermination(1,java.util.concurrent.TimeUnit.MINUTES);System.out.println("Final count: "+counter.getCount());}}

在上述代码中,我们使用AtomicInteger类来替代普通的int类型,AtomicInteger的incrementAndGet方法是原子操作,保证了并发安全。

总结

通过这个实战案例,我们展示了如何在Web应用中使用虚拟线程提升并发处理能力。通过创建虚拟线程的执行器服务,并将任务提交到该服务中执行,我们可以充分利用虚拟线程的轻量级特性,在短时间内处理更多的请求。同时,我们也探讨了并发安全问题,并给出了相应的解决方案。

掌握了虚拟线程在Web应用中的应用内容后,下一节我们将深入学习虚拟线程在其他场景下的应用案例,进一步完善对本章JDK 21虚拟线程实战主题的认知。

🍃 系列专栏导航

  • 🔖 专栏目录《JDK21新特性》

  • 🔖 JDK5新特性
  • 🔖 JDK8新特性
  • 🔖 JDK11新特性
  • 🔖 JDK17新特性

建议按系列顺序阅读,从基础到进阶逐步掌握核心能力,避免遗漏关键知识点~

其他专栏衔接

  • 🔖 《深入浅出Mybatis》
  • 🔖 《全面掌握Swagger:从入门到实战》
  • 🔖 《Lombok:高效Java开发的秘密武器(完全解读)》
  • 🍃 博客概览:《程序员技术成长导航,专栏汇总》
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/23 2:07:57

JDK17微服务通信:RESTful API实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/23 2:07:12

基于SpringBoot+SSM的高校大学生党建系统设计与实现

最近总有人来问我高校大学生党建系统怎么做&#xff0c;尤其是毕业设计选了Java方向&#xff0c;看到标题写着SpringBootSSM就直接懵掉的&#xff0c;不在少数。这套基于JavaSpringBootSSM的高校大学生党建系统&#xff0c;核心就一句话&#xff1a;把学生从提交入党申请、积极…

作者头像 李华
网站建设 2026/10/23 2:06:15

PCL2启动器完全指南:从下载安装到高级使用技巧

PCL2启动器完全指南&#xff1a;从下载安装到高级使用技巧 PCL2&#xff08;Plain Craft Launcher 2&#xff09;是一款功能强大的Minecraft启动器&#xff0c;以其出色的下载速度、模块化架构和优秀的兼容性而闻名。本文将为您提供从基础安装到高级使用的完整指南。 &#x…

作者头像 李华