news 2026/7/31 18:27:32

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/7/29 20:58:23

77777

777777

作者头像 李华
网站建设 2026/7/30 10:22:07

大麦抢票终极指南:DamaiHelper全自动解决方案

你是否曾经因为抢不到心仪的演唱会门票而遗憾&#xff1f;在票务平台竞争激烈的今天&#xff0c;手动抢票已经变得越来越困难。DamaiHelper作为一款基于PythonSelenium开发的自动化抢票工具&#xff0c;能够帮你解决这个难题&#xff0c;让你轻松获取热门演出的入场券。 【免费…

作者头像 李华
网站建设 2026/7/31 17:02:41

大学计算机

计算机专业四年规划&#xff1a;从零基础到职场竞争力&#xff0c;避开 90% 人踩的坑“计算机 高薪铁饭碗”“会玩电脑就能学好”“毕业即拿大厂 offer”—— 高考填报志愿时&#xff0c;这些标签让计算机专业成为热门中的热门。但真正踏入大学校园才发现&#xff0c;这里没有…

作者头像 李华
网站建设 2026/7/31 15:36:13

一口气解释清楚转换流存在的原因

本文从为什么发明转换流&#xff0c;什么时候用转换流这个角度来解释 博主在学习io流的时候就对这两个点疑惑&#xff0c;如果你也这样可以跟随我的视角来理解转换流的作用 &#xff08;字面意思&#xff1a;字节流和字符流的转换&#xff09; 解码过程&#xff1a;字节流→指定…

作者头像 李华
网站建设 2026/7/31 5:32:26

从卧床不起到健步如飞 退休老阿姨用机器人治腰突的亲身体验!

我年轻的时候在纺织厂踩了三十年缝纫机&#xff0c;退休后本以为能享清福&#xff0c;哪料儿子一句“妈&#xff0c;孩子没人带”&#xff0c;又让我化身“全职孙保姆”。小孙子刚会爬那会儿&#xff0c;我每天弯腰抱娃上百次&#xff0c;蹲上蹲下的捡玩具&#xff0c;半夜还得…

作者头像 李华
网站建设 2026/7/30 6:43:34

Java毕设项目:基于springboot新能源汽车销售管理系统基于Java Web的新能源汽车信息咨询服务(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华