打破并发瓶颈:虚拟线程实现详解与传统线程模型的性能对比

目录

一、定义与特性

 二、虚拟线程实现

2.1 使用 Thread.startVirtualThread() 创建

2.2 使用 Thread.ofVirtual() 创建

2.3 使用 ThreadFactory 创建

2.4 使用 Executors.newVirtualThreadPerTaskExecutor()创建

三、虚拟线程和普通线程的区别

3.1 线程管理方式不同

3.2 创建成本不同

3.3 并发编程模型的简化

3.4 阻塞操作的影响


一、定义与特性

定义:

        (1)虚拟线程是Java19提出来的一个概念,Java19提供特性预览,开放实装是Java21。

        (2)虚拟线程是一种由JVM而非操作系统直接管理的线程。它独立于操作系统。虚拟线程是依附于主线程的,如果主线程销毁了,虚拟线程也不复存在。

特性(优点):

        1.轻量级:虚拟线程的创建和销毁代价极低,与传统线程相比内存占用少。

        2.高并发:支持数百万级别的并发进程,不会因线程数量限制系统性能。

        3.与传统线程兼容:完全兼容现有的线程API,无需修改代码即可引入虚拟线程。

缺点:

        1.不适用于计算密集型任务:虚拟线程适用于I/O密集型任务,但不适用于计算密集型任务,因为密集型计算始终需要CPU资源作为支持。

        2.与某些第三方库不兼容。

 二、虚拟线程实现

虚拟线程的使用和普通线程几乎一样,唯一的区别在于创建虚拟线程只能通过特定的方法。

在SpringBoot中使用虚拟线程要求SpringBoot的版本最低是 3.x ,JDK的版本不能低于21

2.1 使用 Thread.startVirtualThread() 创建

直接通过Thread静态方法创建,该方式无法指定线程名称,线程名称默认为:null

    @Testvoid testVirtualThread4() {Thread.startVirtualThread(() -> System.out.printf("线程ID:%s - 任务执行完成", Thread.currentThread().threadId())) ;}

2.2 使用 Thread.ofVirtual() 创建

ofVirtual()方法创建的虚拟线程默认是自动执行的,可创建不自动启动的线程,手动执行。

    @Testvoid testVirtualThread2() {// 创建虚拟线程并自动执行Thread.Builder.OfVirtual virtual = Thread.ofVirtual().name("pack1");virtual.start(() -> System.out.printf("%s - VirtualThread1自动执行任务完成\n", Thread.currentThread().getName()));// 创建不自动启动的线程Thread thread = virtual.unstarted(() -> System.out.printf("%s - VirtualThread1手动执行任务完成\n", Thread.currentThread().getName()));// 手动启动虚拟线程thread.start();}

2.3 使用 ThreadFactory创建

    @Testvoid testVirtualThread3() {ThreadFactory threadFactory = Thread.ofVirtual().name("threadFactory").factory();threadFactory.newThread(() -> System.out.printf("%s - 通过工厂创建执行任务完成", Thread.currentThread().getName())).start();}

2.4 使用 Executors.newVirtualThreadPerTaskExecutor()创建

创建一个执行器,为每个任务启动一个新的虚拟线程

    @Testvoid testVirtualThread1() {try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {IntStream.range(0, 10_000).forEach(i -> executor.submit(() -> {Thread.sleep(Duration.ofSeconds(1));System.out.println(STR."task: \{i}");return i;}));}}

三、虚拟线程和普通线程的区别

3.1 线程管理方式不同

  • 虚拟线程:虚拟线程由JVM管理,少量映射到操作系统线程上,实现轻量化,避免了直接依赖操作系统的线程创建、调度和销毁开销。
  • 普通线程:传统的线程是由操作系统直接管理的,每创建一个线程都会占用系统资源,并由操作系统负责调度。

3.2 创建成本不同

  • 虚拟线程:创建成本低,因为不需要操作系统的参与,大多数管理工作由JVM来完成。
  • 普通线程:创建成本比较高,每个线程都会占用一部分操作系统的资源,如:内存和CPU,并且需要频繁的上下文切换。

3.3 并发编程模型的简化

  • 虚拟线程:虚拟线程轻量高效,无需复杂线程池管理,每个任务可直接分配独立线程执行。
  • 普通线程:传统线程开销大,通常需线程池优化,避免频繁创建销毁。

3.4 阻塞操作的影响

  • 虚拟线程:虚拟线程能高效处理阻塞操作,JVM可轻量挂起阻塞线程并调度其他任务,几乎无系统压力。
  • 普通线程:阻塞操作会导致线程挂起,高并发时可能耗尽系统资源。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/88728.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/88728.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“28项评测23项SOTA——GLM-4.1V-9B-Thinking本地部署教程:10B级视觉语言模型的性能天花板!

一、模型介绍 GLM-4.1V-9B-Thinking是由智谱AI联合清华大学团队推出的多模态大模型,以GLM-4-9B-0414基座模型为底,通过引入“思维链推理机制”和“课程采样强化学习策略”(Reinforcement Learning with Curriculum Sampling)&…

推荐系统-Random算法

Random算法总结引言 在推荐系统研究与应用中,我们常常需要一些简单的基线算法来衡量更复杂算法的性能提升。Random(随机推荐)算法是最基础的基线方法之一,它通过随机生成评分来模拟用户对物品的偏好。虽然这种方法看似简单&#x…

Django--02模型和管理站点

Django–02模型与站点管理 Part 2: Models and the admin site 本教程承接Django–01的内容。我们将设置数据库、创建你的第一个模型,并快速了解 Django 自动生成的管理站点。 文章目录Django--02模型与站点管理前言一、设置数据库1.1 参考文档链接1.2 默认设置1.3…

CS课程项目设计1:交互友好的井字棋游戏

最近突然想开设一个专栏了,专门为计算机专业的同行分享一些入门级的课程项目设计,旨在让同学更好地了解CS项目的设计流程,同时给出代码来介绍coding过程。 今天要分享的是第一个CS课程项目:交互友好的井字棋游戏。 1. 研究目的 井…

首个自动驾驶VLA综述介绍

当视觉(Vision)、语言(Language)和行动(Action)三大能力在一个模型中融合,自动驾驶的未来将走向何方? 近日,来自麦吉尔大学、清华大学、小米公司和威斯康辛麦迪逊的研究团队联合发布了全球首篇针对自动驾驶领域的视觉-语言-行动(Vision-Language-Action, VLA)模型的…

C# 接口(接口可以继承接口)

接口可以继承接口 之前我们已经知道接口实现可以从基类被继承,而接口本身也可以从一个或多个接口继承而来。要指定某个接口继承其他的接口,应在接口声明中把基接口名称以逗号分隔的列表形式 放在接口名称后面的冒号之后,如下所示。类在基类列…

linux----------------------线程同步与互斥(上)

1.线程互斥 1-1 进程线程间的互斥相关背景概念 临界资源:多线程执行流共享的资源就叫做临界资源 临界区:每个线程内部访问临界资源的代码就叫做临界区 互斥:任何时刻,互斥保证只有一个执行进入临界区,对临界资源起…

百度AI的开放新篇章:文心4.5本地化部署指南与未来生态战略展望

百度AI的开放新篇章:文心4.5本地化部署指南与未来生态战略展望 一起来玩转文心大模型吧👉文心大模型免费下载地址:https://ai.gitcode.com/theme/1939325484087291906 🌟 嗨,我是IRpickstars! &#x1f30…

笔记/sklearn中的数据划分方法

文章目录一、前言二、数据划分方法1. 留出法(Hold-out)2. K折交叉验证(K-Fold)3. 留一法(Leave-One-Out)三、总结一、前言 简要介绍数据划分在机器学习中的作用。 二、数据划分方法 1. 留出法&#xff0…

Android14 开屏页SplashScreen设置icon圆角的原理

简介 我们在看到一个应用在启动的时候会看到一个启动的icon,这个图标是应用的icon当然也是可以应用自己去控制的如 <item name="android:windowSplashScreenAnimatedIcon">@drawable/adas_icon</item> 图上的效果明显不理想,图标是自带圆角,而且还是…

flutter redux状态管理

&#x1f4da; Flutter 状态管理系列文章目录 Flutter 状态管理(setState、InheritedWidget、 Provider 、Riverpod、 BLoC / Cubit、 GetX 、MobX 、Redux) setState() 使用详解&#xff1a;原理及注意事项 InheritedWidget 组件使用及原理 Flutter 中 Provider 的使用、注…

AMIS全栈低代码开发

amis是百度开源的前端低代码框架&#xff0c;它通过JSON配置来生成各种后台页面&#xff0c;旨在简化前端开发过程&#xff0c;提高开发效率&#xff0c;降低开发门槛。以下是详细介绍&#xff1a; 核心特点&#xff1a; 可视化开发&#xff1a;允许开发者通过可视化方式构建页…

【Python基础】变量、运算与内存管理全解析

一、删除变量与垃圾回收&#xff1a;内存管理的底层逻辑 在Python中&#xff0c;变量是对象的引用&#xff0c;而不是对象本身。当我们不再需要某个变量时&#xff0c;可以用del语句删除它的引用&#xff0c;让垃圾回收机制&#xff08;GC&#xff09;自动清理无引用的对象。 1…

Spring Boot + Javacv-platform:解锁音视频处理的多元场景

Spring Boot Javacv-platform&#xff1a;解锁音视频处理的多元场景 一、引言 在当今数字化时代&#xff0c;音视频处理已成为众多应用场景中不可或缺的一部分&#xff0c;从在线教育、视频会议到短视频平台、智能安防等&#xff0c;音视频数据的处理与分析需求日益增长。Java…

k8s 的基本原理、架构图、使用步骤和注意事项

Kubernetes&#xff08;k8s&#xff09;是一个开源的容器编排平台&#xff0c;用于自动化部署、扩展和管理容器化应用。以下是其基本原理、使用步骤和注意事项的总结&#xff1a;一、k8s 基本原理核心架构 Master 节点&#xff1a;控制集群的核心组件&#xff0c;包括&#xff…

Qt 多线程编程:单例任务队列的设计与实现

引言&#xff1a; 在现代应用程序开发中&#xff0c;多线程编程已成为处理异步任务的标配。对于 GUI 应用而言&#xff0c;保持主线程的响应性尤为重要。本文将详细介绍一个基于 Qt 的单例任务队列实现方案&#xff0c;它通过线程池和单例模式&#xff0c;优雅地解决了后台任务…

OpenEuler操作系统中检测插入的USB设备并自动挂载

OpenEuler操作系统中检测插入的USB设备并自动挂载 项目需求&#xff1a;工控机上openeuler操作系统是无界面版本的&#xff0c;在工控机上连接了激光雷达&#xff0c;当激光雷达采集完数据&#xff0c;我们要将采集数据导入u盘&#xff0c;故需要在工控机上插入u盘&#xff0c;…

《Spring 中上下文传递的那些事儿》Part 11:上下文传递最佳实践总结与架构演进方向

&#x1f4dd; Part 11&#xff1a;上下文传递最佳实践总结与架构演进方向 经过前面几篇文章的深入探讨&#xff0c;我们已经系统性地学习了 Spring 应用中上下文传递的各种技术原理、常见问题以及解决方案。从 Web 请求上下文到异步任务、从多租户隔离到日志脱敏&#xff0c;…

使用云虚拟机搭建hadoop集群环境

使用云虚拟机搭建hadoop集群环境 安装jdk17 配置docker网络 docker network create --subnet172.18.0.0/16 hadoop 172.18.0.0&#xff1a;这是子网的网络地址&#xff0c;也就是这个网络的起始地址。/16&#xff1a;这是子网掩码&#xff08;Network Mask&#xff09;&#x…

【机器学习】吴恩达机器学习课程代码作业-Python版本

吴恩达老师的机器学习课程作业是MATLAB版本&#xff08;Octave&#xff09;的&#xff0c;现在有点过时了&#xff0c;我参考了几位大牛的代码&#xff0c;将作业改成了Python3.6版本&#xff0c;并做了中文注释&#xff0c;推荐使用Jupyter notebook。Python作业使用了原版数据…