当前位置: 首页 > news >正文

Java小白-线程 vs 虚拟线程,Java并发的新旧对决

一、什么是传统线程?

        Java 里的传统线程(java.lang.Thread)其实是 操作系统级别的线程(OS Thread),每创建一个 Thread 对象,JVM 底层会向操作系统申请内核线程资源。特点有:线程上下文切换成本高;需要配合线程池(如 ThreadPoolExecutor)来复用;IO 阻塞会卡死一个真实线程。

二、什么是虚拟线程(Virtual Thread)?

        虚拟线程(Java 21 正式引入,源自 Project Loom),是由 JVM 自己调度的轻量线程,不再直接绑定一个 OS 线程。而它的特点是:由 JVM 的调度器托管,切换更轻;可以创建海量线程(百万级别);IO 阻塞自动挂起,节省内核线程。

三、传统线程 VS 虚拟线程 —— 实现对比

下面是一个示例,用来演示如何启动 1 万个线程 / 虚拟线程,分别跑一个简单的任务。

传统线程:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class TraditionalThreadDemo {public static void main(String[] args) throws InterruptedException {// 创建一个固定大小的线程池ExecutorService executor = Executors.newFixedThreadPool(10);long start = System.currentTimeMillis();// 启动 100 个任务for (int i = 0; i < 100; i++) {int taskId = i;executor.submit(() -> {System.out.println("传统线程执行任务:" + taskId + " - " + Thread.currentThread().getName());try {Thread.sleep(1000); // 模拟 IO} catch (InterruptedException e) {e.printStackTrace();}});}executor.shutdown();while (!executor.isTerminated()) {Thread.sleep(100);}long end = System.currentTimeMillis();System.out.println("传统线程总耗时:" + (end - start) + " ms");}
}

虚拟线程--需要 JDK 21+:

public class VirtualThreadDemo {public static void main(String[] args) throws InterruptedException {long start = System.currentTimeMillis();// 启动 100 个虚拟线程for (int i = 0; i < 100; i++) {int taskId = i;Thread.startVirtualThread(() -> {System.out.println("虚拟线程执行任务:" + taskId + " - " + Thread.currentThread().getName());try {Thread.sleep(1000); // 模拟 IO} catch (InterruptedException e) {e.printStackTrace();}});}// 主线程等待足够时间,确保所有虚拟线程完成Thread.sleep(2000);long end = System.currentTimeMillis();System.out.println("虚拟线程总耗时:" + (end - start) + " ms");}
}

对比结果:

特性传统线程虚拟线程
创建成本超低
数量1 万就容易撑爆百万没问题
调度OS 调度JVM 自己调度
IO 阻塞阻塞 OS 线程自动挂起,释放内核线程
适用场景CPU 密集型 / 大任务IO 密集型 / 高并发服务

还可以把任务量调到 100000,传统线程会直接卡死或 OOM,但虚拟线程能稳稳跑。另外可以把 Thread.sleep(1000) 换成 HTTP 请求,能更真实地体现 IO 阻塞优势。

http://www.dtcms.com/a/276966.html

相关文章:

  • LeetCode--44.通配符匹配
  • Java4种设计模式详解(单例模式、工厂模式、适配器模式、代理模式)
  • Linux的 iproute2 配置:以太网(Ethernet)、绑定(Bond)、虚拟局域网(VLAN)、网桥(Bridge)笔记250713
  • 文心一言大模型4.5系列开源测评
  • 【Leetcode】2410. 运动员和训练师的最大匹配数
  • 预处理器完整功能介绍和示例演示(LESS/SCSS)
  • 笔记-极客-DDD实战-基于DDD的微服务拆分与设计
  • MongoDB数据基本介绍
  • 决策树的相关理论学习
  • [论文阅读] 软件工程 | 首个德语软件工程情感分析黄金标准数据集:构建与价值解析
  • Java设计模式之行为型模式(命令模式)介绍与说明
  • 什么时候会用到 concurrent.futures?要不要背?
  • 【Linux | 网络】应用层
  • 003_了解Claude
  • 基于SpringBoot3集成Kafka集群
  • MongoDB性能优化实战指南:原理、实践与案例
  • 【设计模式】职责链模式(责任链模式) 行为型模式,纯与不纯的职责链模式
  • 前端框架状态管理对比:Redux、MobX、Vuex 等的优劣与选择
  • ALB、NLB、CLB 负载均衡深度剖析
  • 闲庭信步使用图像验证平台加速FPGA的开发:第十二课——图像增强的FPGA实现
  • axios拦截器
  • spring cloud负载均衡分析之FeignBlockingLoadBalancerClient、BlockingLoadBalancerClient
  • 【Qt开发】Qt的背景介绍(一)
  • 时序预测 | Matlab代码实现VMD-TCN-GRU-MATT变分模态分解时间卷积门控循环单元多头注意力多变量时序预测
  • [特殊字符] Python自动化办公 | 3步实现Excel数据清洗与可视化,效率提升300%
  • 开源链动2+1模式、AI智能名片与S2B2C商城小程序在私域运营中的协同创新研究
  • 从零开始跑通3DGS教程:(五)3DGS训练
  • 《区间dp》
  • 一文读懂现代卷积神经网络—深度卷积神经网络(AlexNet)
  • 深入理解观察者模式:构建松耦合的交互系统