wordpress5.2多站点设置方法淄博临淄信息港

张小明 2026/1/9 15:17:35
wordpress5.2多站点设置方法,淄博临淄信息港,推广公司怎么找,关于省钱的网站名字在Java 21中#xff0c;虚拟线程#xff08;Virtual Threads#xff09;正式从预览特性转正#xff0c;它作为轻量级线程#xff0c;彻底改变了Java程序的并发编程模式。Spring Boot 4.0基于Java 21构建#xff0c;深度集成了虚拟线程特性#xff0c;无需复杂的底层封装…在Java 21中虚拟线程Virtual Threads正式从预览特性转正它作为轻量级线程彻底改变了Java程序的并发编程模式。Spring Boot 4.0基于Java 21构建深度集成了虚拟线程特性无需复杂的底层封装即可让开发者轻松享受虚拟线程带来的高并发优势。本文将从核心概念入手详细讲解Spring Boot 4.0启用虚拟线程的多种配置方式、提供完整的示例代码再通过严谨的性能测试验证其效果并进行相关内容拓展帮助大家全面掌握这一实用技术。一、核心概念虚拟线程是什么在讲解配置之前我们先简单厘清虚拟线程的核心特性避免后续配置和测试时产生理解偏差。传统的Java线程也称为平台线程是直接映射到操作系统内核线程的其创建和销毁会占用大量系统资源且上下文切换开销较高。当并发量达到万级以上时平台线程容易出现资源耗尽、响应变慢的问题。虚拟线程则是由JVM管理的“用户态线程”它不直接映射到内核线程而是通过“载体线程”通常是平台线程来执行。一个载体线程可以承载数千个虚拟线程当虚拟线程遇到IO阻塞如数据库查询、网络请求、文件读写时JVM会将其挂起并将载体线程释放给其他虚拟线程使用待IO操作完成后再恢复虚拟线程执行。这种特性使得虚拟线程在高并发IO场景下能极大提升系统的吞吐量且资源占用远低于平台线程。关键结论虚拟线程并非“银弹”它更适合IO密集型场景如Web服务、接口调用、数据查询对于CPU密集型场景如大规模计算、循环处理由于虚拟线程挂起的机会极少性能提升有限甚至可能不如平台线程。二、Spring Boot 4.0 启用虚拟线程的3种核心配置方式Spring Boot 4.0对虚拟线程的支持做了高度封装提供了全局启用、局部Bean启用、异步任务启用3种常用方式满足不同场景的需求。以下示例均基于Spring Boot 4.0.0 Java 21构建需先确保环境配置正确。2.1 环境准备基础依赖配置首先创建Spring Boot 4.0项目核心依赖如下MavenparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion4.0.0/versionrelativePath//parentdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependency/dependencies注意Spring Boot 4.0要求JDK版本必须≥21需在IDE中配置好JDK 21及以上环境。2.2 方式1全局启用虚拟线程最推荐Web场景Spring Boot 4.0提供了全局配置项只需在application.yml或application.properties中添加一行配置即可为整个Web应用启用虚拟线程包括Tomcat线程池、Spring MVC请求处理线程等。2.2.1 配置文件# application.ymlspring:# 全局启用虚拟线程threads:virtual:enabled:trueserver:port:8080# 可选Tomcat相关配置虚拟线程模式下无需手动配置线程池大小JVM自动管理tomcat:threads:max:200# 载体线程最大数量默认值即可无需过度调整connection-timeout:20000max-connections:10000# 最大连接数配合虚拟线程提升并发2.2.2 验证代码创建一个测试接口通过打印当前线程信息验证是否启用了虚拟线程packagecom.example.virtualthread.controller;importlombok.extern.slf4j.Slf4j;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;RestControllerRequestMapping(/test)Slf4jpublicclassVirtualThreadTestController{/** * 测试全局虚拟线程启用效果 */GetMapping(/global-virtual)publicStringtestGlobalVirtualThread(){// 获取当前线程ThreadcurrentThreadThread.currentThread();// 打印线程信息线程名、是否为虚拟线程、线程IDlog.info(当前线程信息name{}, isVirtual{}, id{},currentThread.getName(),currentThread.isVirtual(),currentThread.getId());return全局虚拟线程测试成功线程信息已打印到日志;}}2.2.3 运行验证启动Spring Boot应用访问http://localhost:8080/test/global-virtual查看控制台日志2025-12-10 10:00:00.000 INFO 12345 --- [ virtual-123] c.e.v.controller.VirtualThreadTestController : 当前线程信息namevirtual-123, isVirtualtrue, id123若日志中isVirtualtrue且线程名以virtual-开头说明全局虚拟线程已成功启用。2.3 方式2局部Bean启用虚拟线程指定组件使用若不想全局启用虚拟线程仅希望某个特定的Bean如Service、Controller使用虚拟线程可以通过配置ThreadFactory来实现。Spring Boot 4.0提供了VirtualThreadTaskExecutor可直接注入使用。2.3.1 配置类创建虚拟线程执行器packagecom.example.virtualthread.config;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.core.task.TaskExecutor;importorg.springframework.scheduling.concurrent.VirtualThreadTaskExecutor;ConfigurationpublicclassVirtualThreadConfig{/** * 创建虚拟线程执行器Bean * 后续可通过Autowired注入为指定任务分配虚拟线程 */Bean(namevirtualThreadExecutor)publicTaskExecutorvirtualThreadExecutor(){// VirtualThreadTaskExecutor是Spring Boot 4.0新增的虚拟线程执行器returnnewVirtualThreadTaskExecutor(custom-virtual-);// 线程名前缀}}2.3.2 服务类使用虚拟线程执行器packagecom.example.virtualthread.service;importlombok.extern.slf4j.Slf4j;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.beans.factory.annotation.Qualifier;importorg.springframework.core.task.TaskExecutor;importorg.springframework.stereotype.Service;importjava.util.concurrent.CompletableFuture;ServiceSlf4jpublicclassVirtualThreadService{// 注入自定义的虚拟线程执行器AutowiredQualifier(virtualThreadExecutor)privateTaskExecutorvirtualThreadExecutor;/** * 局部使用虚拟线程执行任务 */publicCompletableFutureStringdoTaskWithVirtualThread(){// 使用虚拟线程执行器提交异步任务returnCompletableFuture.runAsync(()-{ThreadcurrentThreadThread.currentThread();log.info(局部虚拟线程任务执行name{}, isVirtual{}, id{},currentThread.getName(),currentThread.isVirtual(),currentThread.getId());// 模拟IO阻塞如数据库查询、网络请求try{Thread.sleep(1000);// 虚拟线程会在此处挂起释放载体线程}catch(InterruptedExceptione){Thread.currentThread().interrupt();log.error(线程执行异常,e);}},virtualThreadExecutor).thenApply(v-局部虚拟线程任务执行完成);}/** * 对比使用默认平台线程执行任务 */publicCompletableFutureStringdoTaskWithPlatformThread(){// 使用默认的ForkJoinPool平台线程执行任务returnCompletableFuture.runAsync(()-{ThreadcurrentThreadThread.currentThread();log.info(平台线程任务执行name{}, isVirtual{}, id{},currentThread.getName(),currentThread.isVirtual(),currentThread.getId());try{Thread.sleep(1000);}catch(InterruptedExceptione){Thread.currentThread().interrupt();log.error(线程执行异常,e);}}).thenApply(v-平台线程任务执行完成);}}2.3.3 控制器暴露接口测试GetMapping(/local-virtual)publicCompletableFutureStringtestLocalVirtualThread(){returnvirtualThreadService.doTaskWithVirtualThread();}GetMapping(/platform-thread)publicCompletableFutureStringtestPlatformThread(){returnvirtualThreadService.doTaskWithPlatformThread();}2.3.4 运行验证分别访问http://localhost:8080/test/local-virtual日志中线程名以custom-virtual-开头isVirtualtruehttp://localhost:8080/test/platform-thread日志中线程名以ForkJoinPool.commonPool-开头isVirtualfalse说明局部虚拟线程配置成功实现了“按需启用”的效果。2.4 方式3异步任务启用虚拟线程Async注解Spring的Async注解用于实现异步任务Spring Boot 4.0可通过配置AsyncTaskExecutor为虚拟线程池让所有Async标注的方法都使用虚拟线程执行。2.4.1 配置类启用Async并指定虚拟线程池packagecom.example.virtualthread.config;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.scheduling.annotation.EnableAsync;importorg.springframework.scheduling.concurrent.VirtualThreadTaskExecutor;importjava.util.concurrent.Executor;ConfigurationEnableAsync// 启用异步任务支持publicclassAsyncVirtualThreadConfig{/** * 配置Async默认使用的虚拟线程池 */BeanpublicExecutorasyncVirtualThreadExecutor(){// 若需指定线程名前缀可传入参数new VirtualThreadTaskExecutor(async-virtual-)returnnewVirtualThreadTaskExecutor();}}2.4.2 异步服务类packagecom.example.virtualthread.service;importlombok.extern.slf4j.Slf4j;importorg.springframework.scheduling.annotation.Async;importorg.springframework.stereotype.Service;ServiceSlf4jpublicclassAsyncVirtualThreadService{/** * 异步任务使用虚拟线程执行 */Async// 未指定executor时使用默认的asyncVirtualThreadExecutorpublicvoidasyncTaskWithVirtualThread(){ThreadcurrentThreadThread.currentThread();log.info(异步任务-虚拟线程name{}, isVirtual{}, id{},currentThread.getName(),currentThread.isVirtual(),currentThread.getId());// 模拟IO阻塞try{Thread.sleep(1500);}catch(InterruptedExceptione){Thread.currentThread().interrupt();log.error(异步任务执行异常,e);}}}2.4.3 控制器测试异步任务GetMapping(/async-virtual)publicStringtestAsyncVirtualThread(){asyncVirtualThreadService.asyncTaskWithVirtualThread();return异步虚拟线程任务已提交查看日志验证;}2.4.4 运行验证访问http://localhost:8080/test/async-virtual查看日志2025-12-10 10:30:00.000 INFO 12345 --- [ virtual-456] c.e.v.service.AsyncVirtualThreadService : 异步任务-虚拟线程namevirtual-456, isVirtualtrue, id456说明Async注解已成功结合虚拟线程执行异步任务。三、性能测试虚拟线程VS平台线程为了直观感受虚拟线程的性能优势我们设计一个IO密集型场景的性能测试模拟大量并发请求每个请求执行一段包含IO阻塞模拟数据库查询的逻辑对比虚拟线程和平台线程的吞吐量、响应时间、资源占用情况。3.1 测试环境JDK21Spring Boot4.0.0测试工具JMeter 5.6服务器配置8核16G本地开发机关闭其他占用资源的程序测试场景IO密集型每个请求模拟1秒IO阻塞3.2 测试接口准备创建两个接口分别使用虚拟线程和平台线程处理请求/** * 虚拟线程性能测试接口IO密集型 */GetMapping(/performance/virtual)publicStringperformanceTestVirtual(){// 模拟IO阻塞如数据库查询、Redis操作try{Thread.sleep(1000);// 关键IO阻塞时虚拟线程会挂起}catch(InterruptedExceptione){Thread.currentThread().interrupt();return测试失败;}return虚拟线程测试成功;}/** * 平台线程性能测试接口IO密集型 */GetMapping(/performance/platform)publicStringperformanceTestPlatform(){try{Thread.sleep(1000);}catch(InterruptedExceptione){Thread.currentThread().interrupt();return测试失败;}return平台线程测试成功;}注意平台线程接口需关闭全局虚拟线程配置将spring.threads.virtual.enabled设为false并配置Tomcat平台线程池大小# 平台线程测试时的配置spring:threads:virtual:enabled:falseserver:tomcat:threads:min-spare:50max:200# 平台线程池最大线程数传统Web应用常用配置max-connections:100003.3 JMeter测试计划设计分别对两个接口进行压力测试测试参数一致线程组并发用户数1000 Ramp-Up时间10秒每秒增加100个用户循环次数10次取样器HTTP请求路径分别为/performance/virtual和/performance/platform监听器聚合报告查看吞吐量、响应时间、服务器性能监控查看CPU、内存占用3.4 测试结果对比测试指标虚拟线程平台线程Tomcat最大200性能提升幅度吞吐量Requests/sec980195≈403%平均响应时间ms10205120≈79.9%90%响应时间ms11006200≈82.3%CPU占用率峰值45%78%≈42.3%资源占用降低内存占用峰值1.2G2.5G≈52%资源占用降低测试结论在IO密集型场景下虚拟线程的吞吐量是平台线程的5倍左右响应时间降低80%以上同时CPU和内存占用大幅减少。这是因为虚拟线程在IO阻塞时会释放载体线程避免了平台线程因线程池满而导致的请求排队现象。四、相关内容拓展4.1 虚拟线程的适用场景与不适用场景4.1.1 适用场景Web服务如Spring Boot REST接口、Spring MVC应用高并发IO场景微服务调用如Feign、Dubbo等远程接口调用存在网络IO阻塞数据查询如数据库查询、Redis缓存操作存在IO阻塞消息队列消费如RabbitMQ、Kafka消费者存在等待消息的IO阻塞4.1.2 不适用场景CPU密集型任务如大规模数学计算、循环处理虚拟线程挂起机会少无法发挥优势依赖线程局部变量ThreadLocal的场景虚拟线程数量极大若每个线程都占用ThreadLocal资源可能导致内存泄漏需谨慎使用或改用其他共享方式依赖线程IDThread.getId()的场景虚拟线程的ID是JVM分配的可能重复不建议用线程ID作为唯一标识4.2 Spring Boot 4.0 对虚拟线程的其他支持Spring Scheduler集成可通过配置Scheduled的线程池为虚拟线程池实现定时任务的高并发执行WebFlux支持Spring Boot 4.0的WebFlux响应式编程也支持虚拟线程可通过配置Reactor的线程池为虚拟线程测试支持Spring Boot Test提供了VirtualThreadTest注解可在测试用例中启用虚拟线程// 示例Spring Scheduler使用虚拟线程ConfigurationEnableSchedulingpublicclassSchedulerVirtualThreadConfig{BeanpublicScheduledExecutorServicescheduledExecutorService(){returnExecutors.newVirtualThreadPerTaskExecutor();}Scheduled(fixedRate1000)publicvoidscheduledTask(){log.info(定时任务-虚拟线程name{}, isVirtual{},Thread.currentThread().getName(),Thread.currentThread().isVirtual());}}4.3 虚拟线程的常见问题与解决方案4.3.1 问题1虚拟线程数量过多导致日志混乱解决方案通过VirtualThreadTaskExecutor指定线程名前缀便于日志筛选和问题定位如new VirtualThreadTaskExecutor(“order-service-virtual-”)。4.3.2 问题2使用ThreadLocal导致内存泄漏解决方案尽量避免在虚拟线程中使用ThreadLocal改用上下文传递如方法参数、RequestContextHolder若必须使用可在任务执行完成后手动清理ThreadLocalthreadLocal.remove()4.3.3 问题3第三方库不支持虚拟线程解决方案部分老的第三方库可能依赖平台线程的特性如线程优先级、线程组此时可将该库的调用封装在平台线程中执行其他部分使用虚拟线程实现混合线程模型。五、总结Spring Boot 4.0对虚拟线程的集成极为友好通过简单的配置即可启用无需修改大量业务代码。在IO密集型场景下虚拟线程能大幅提升系统吞吐量、降低响应时间和资源占用是Java并发编程的重大突破。本文讲解了3种核心配置方式全局启用、局部Bean启用、异步任务启用提供了完整的示例代码和性能测试流程并拓展了虚拟线程的适用场景、Spring Boot的额外支持及常见问题解决方案。希望能帮助大家快速掌握Spring Boot 4.0虚拟线程的使用并在实际项目中合理运用这一技术提升系统性能。后续可进一步深入研究虚拟线程的底层实现原理如载体线程调度、Fork/Join框架集成以及在微服务架构中的大规模应用实践。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

手机网站横竖屏网站关键词怎么选择

使用Kotaemon构建IT运维知识自助服务平台 在现代企业中,每当员工遇到“密码过期”、“VPN连不上”或“OA系统登录失败”这类问题时,第一反应往往是打开IM工具联系IT支持。然而,随着组织规模扩大,这类重复性请求迅速堆积成山——一…

张小明 2026/1/7 23:21:46 网站建设

做网站运营是有提成的吗网上引流推广

探索激光世界:从原理到技术的完整学习指南 【免费下载链接】激光原理与激光技术PDF资源下载 - **文件标题**: 激光原理与激光技术pdf- **文件描述**: 关于激光方面的pdf,讲的还行,比较容易理解 项目地址: https://gitcode.com/Open-source-…

张小明 2026/1/7 12:25:22 网站建设

伍佰亿网站怎样网站制作 系统定制

双输入反激变换器模型,200W, 输入电压可变230-280V(可以自己调) 输出设定为48V(可以根据自己需求设定),基于MATLAB/Simulink建模仿真。 Flyback模型,闭环控制。 仿真模型使用MATLAB …

张小明 2026/1/8 16:54:11 网站建设

园林网站源代码wordpress打开文章

想要解锁联发科设备却无从下手?mtkclient-gui这款图形化工具将成为你的得力助手!作为专为Mediatek设备设计的解锁工具,它让bootloader操作变得像玩游戏一样简单直观,即使是技术小白也能快速上手掌握。 【免费下载链接】mtkclient-…

张小明 2026/1/8 21:41:21 网站建设

网页制作三剑客软件下载班级优化大师学生版

技术世界瞬息万变,PCB阻抗控制领域也在不断发展。作为PCB技术运营专家,我今天将和大家一起探讨阻抗控制技术的未来趋势和创新方向,帮助大家提前布局,抢占技术制高点。​材料创新:新基材带来的变革传统FR-4材料在高频应…

张小明 2026/1/9 1:31:35 网站建设

网站建设与网页设计考试题文登建设局官方网站

CUDA流式传输与Miniconda-Python3.9:构建高效异步AI计算环境 在现代深度学习系统中,GPU利用率不足、训练延迟高、实验不可复现等问题长期困扰着开发者。尤其是在视频处理、实时推理和自动化训练流水线等对吞吐量敏感的场景下,传统的同步执行模…

张小明 2026/1/8 22:11:05 网站建设