news 2026/4/29 3:23:40

JDK虚拟线程测试及用法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JDK虚拟线程测试及用法

前言

  • JDK21可以说是一个史诗级的产品,带来了目前Java高并发较为顶级解决方案虚拟线程,话不多说,直接来上代码体验一下功能,洛阳目前使用的笔记本是华为的matebook D15 2022款,16+512,cpu是i7-1195G7,idea2024.1.7,所有都是使用默认配置,话不多说,上代码(全部代码在最后)

正文

  1. 先是一个模拟IO操作的方法
// 模拟工作负载的方法privatestaticvoidsimulateWork(){try{// 模拟一个耗时100毫秒的I/O操作Thread.sleep(100);}catch(InterruptedExceptione){// 如果线程被中断,重新设置中断状态Thread.currentThread().interrupt();}}
  1. 使用虚拟线程的测试代码
// 使用虚拟线程执行任务的方法privatestaticlongexecuteWithVirtualThreads(inttaskCount)throwsInterruptedException{// 记录开始时间longstart=System.currentTimeMillis();// 创建一个虚拟线程执行器try(ExecutorServiceexecutor=Executors.newVirtualThreadPerTaskExecutor()){// 提交taskCount个任务到虚拟线程执行器for(inti=0;i<taskCount;i++){executor.submit(Test::simulateWork);}// 关闭执行器,不再接受新任务executor.shutdown();// 等待所有任务完成,最多等待1小时executor.awaitTermination(1,TimeUnit.HOURS);}// 计算并返回总耗时returnSystem.currentTimeMillis()-start;}
  1. 使用线程池的测试代码
// 使用传统线程执行任务的方法privatestaticlongexecuteWithTraditionalThreads(inttaskCount)throwsInterruptedException{// 记录开始时间longstart=System.currentTimeMillis();// 创建一个固定大小为100的线程池try(ExecutorServiceexecutor=Executors.newFixedThreadPool(100)){// 提交taskCount个任务到线程池for(inti=0;i<taskCount;i++){executor.submit(Test::simulateWork);}// 关闭线程池,不再接受新任务executor.shutdown();// 等待所有任务完成,最多等待1小时executor.awaitTermination(1,TimeUnit.HOURS);}// 计算并返回总耗时returnSystem.currentTimeMillis()-start;}
  1. 格式化时间(可有可无)
// 格式化时间的方法,将毫秒转换为更易读的格式privatestaticStringformatTime(longmilliseconds){// 返回格式化的字符串,同时显示毫秒数和秒数(保留两位小数)returnString.format("%d 毫秒 (%.2f 秒)",milliseconds,milliseconds/1000.0);}
  1. main方法
publicstaticvoidmain(String[]args)throwsInterruptedException{// 设置要执行的任务数量inttaskCount=100000;// 开始测试传统线程System.out.println("正在使用传统线程执行任务...");// 执行传统线程测试并记录耗时longtraditionalTime=executeWithTraditionalThreads(taskCount);// 输出传统线程的执行时间System.out.println("传统线程完成任务,耗时 "+formatTime(traditionalTime));// 开始测试虚拟线程System.out.println("\n正在使用虚拟线程执行任务...");// 执行虚拟线程测试并记录耗时longvirtualTime=executeWithVirtualThreads(taskCount);// 输出虚拟线程的执行时间System.out.println("虚拟线程完成任务,耗时 "+formatTime(virtualTime));// 计算两种线程执行时间的差异longtimeDifference=traditionalTime-virtualTime;// 输出性能差异和速度提升倍数System.out.println("\n性能差异:"+formatTime(timeDifference)+" ("+String.format("%.2f",(double)traditionalTime/virtualTime)+" 倍速度提升)");}
  1. 运行结果
正在使用传统线程执行任务...传统线程完成任务,耗时106725毫秒(106.73)正在使用虚拟线程执行任务...虚拟线程完成任务,耗时2014毫秒(2.01)性能差异:104711毫秒(104.71)(52.99倍速度提升)Processfinishedwithexitcode0
  1. 可以看到,使用了虚拟线程之后,速度提升了50倍左右,至于底层原理之类的,那不是洛阳这种小垃圾去看的,洛阳只学会能够如何使用就可以了(手动狗头),以下是整个测试类的完整代码,大家可以自己跑一下感受一下,但是虚拟线程也并不是说能够无脑上,要根据实际情况考虑,正所谓没有最好的架构、只有最合适的架构。
packagecom.travel.echo.test;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;importjava.util.concurrent.TimeUnit;/** * @Description * @Author LuoYang * @Date 2025/12/6 周六 */publicclassTest{publicstaticvoidmain(String[]args)throwsInterruptedException{// 设置要执行的任务数量inttaskCount=100000;// 开始测试传统线程System.out.println("正在使用传统线程执行任务...");// 执行传统线程测试并记录耗时longtraditionalTime=executeWithTraditionalThreads(taskCount);// 输出传统线程的执行时间System.out.println("传统线程完成任务,耗时 "+formatTime(traditionalTime));// 开始测试虚拟线程System.out.println("\n正在使用虚拟线程执行任务...");// 执行虚拟线程测试并记录耗时longvirtualTime=executeWithVirtualThreads(taskCount);// 输出虚拟线程的执行时间System.out.println("虚拟线程完成任务,耗时 "+formatTime(virtualTime));// 计算两种线程执行时间的差异longtimeDifference=traditionalTime-virtualTime;// 输出性能差异和速度提升倍数System.out.println("\n性能差异:"+formatTime(timeDifference)+" ("+String.format("%.2f",(double)traditionalTime/virtualTime)+" 倍速度提升)");}// 使用传统线程执行任务的方法privatestaticlongexecuteWithTraditionalThreads(inttaskCount)throwsInterruptedException{// 记录开始时间longstart=System.currentTimeMillis();// 创建一个固定大小为100的线程池try(ExecutorServiceexecutor=Executors.newFixedThreadPool(100)){// 提交taskCount个任务到线程池for(inti=0;i<taskCount;i++){executor.submit(Test::simulateWork);}// 关闭线程池,不再接受新任务executor.shutdown();// 等待所有任务完成,最多等待1小时executor.awaitTermination(1,TimeUnit.HOURS);}// 计算并返回总耗时returnSystem.currentTimeMillis()-start;}// 使用虚拟线程执行任务的方法privatestaticlongexecuteWithVirtualThreads(inttaskCount)throwsInterruptedException{// 记录开始时间longstart=System.currentTimeMillis();// 创建一个虚拟线程执行器try(ExecutorServiceexecutor=Executors.newVirtualThreadPerTaskExecutor()){// 提交taskCount个任务到虚拟线程执行器for(inti=0;i<taskCount;i++){executor.submit(Test::simulateWork);}// 关闭执行器,不再接受新任务executor.shutdown();// 等待所有任务完成,最多等待1小时executor.awaitTermination(1,TimeUnit.HOURS);}// 计算并返回总耗时returnSystem.currentTimeMillis()-start;}// 模拟工作负载的方法privatestaticvoidsimulateWork(){try{// 模拟一个耗时100毫秒的I/O操作Thread.sleep(100);}catch(InterruptedExceptione){// 如果线程被中断,重新设置中断状态Thread.currentThread().interrupt();}}// 格式化时间的方法,将毫秒转换为更易读的格式privatestaticStringformatTime(longmilliseconds){// 返回格式化的字符串,同时显示毫秒数和秒数(保留两位小数)returnString.format("%d 毫秒 (%.2f 秒)",milliseconds,milliseconds/1000.0);}}

结尾

  • 悲观者永远正确 乐观者永远前行
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/22 1:46:42

66666

666666

作者头像 李华
网站建设 2026/4/27 13:04:06

88888

88888

作者头像 李华
网站建设 2026/4/16 21:52:59

使用Ollama运行GPT-OSS-20B实现低延迟对话响应的调优技巧

使用Ollama运行GPT-OSS-20B实现低延迟对话响应的调优技巧 你有没有遇到过这样的场景&#xff1a;在使用云端大模型时&#xff0c;明明问题已经输入完毕&#xff0c;却要等上一两秒才能看到第一个字蹦出来&#xff1f;更别提网络波动导致的超时、敏感数据不敢上传的顾虑&#xf…

作者头像 李华
网站建设 2026/4/17 7:27:12

Mem Reduct内存管理终极指南:告别卡顿,拥抱流畅体验

Mem Reduct内存管理终极指南&#xff1a;告别卡顿&#xff0c;拥抱流畅体验 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memreduc…

作者头像 李华
网站建设 2026/4/27 9:05:15

基于高质量数据训练的专业化代码生成模型——Seed-Coder-8B-Base

基于高质量数据训练的专业化代码生成模型——Seed-Coder-8B-Base 在今天的软件开发环境中&#xff0c;开发者每天都在与重复性编码、语法陷阱和团队协作中的风格冲突打交道。尽管通用大语言模型已经能够“写代码”&#xff0c;但它们更像是泛读百书的通才——懂得多&#xff0c…

作者头像 李华
网站建设 2026/4/17 7:26:34

YooAsset实战:大型手游资源管理案例解析

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个手游资源管理案例演示项目&#xff0c;使用YooAsset实现以下功能&#xff1a;1) 动态加载场景资源 2) AB包依赖管理 3) 热更新流程实现。要求包含完整的项目结构&#xff0…

作者头像 李华