首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏王磊的博客

    面试官:什么是虚拟线程?为什么要有虚拟线程

    Java 中的虚拟线程,也叫做协程或“轻量级线程”,它诞生于 JDK 19(预览 API),正式发布于 JDK 21,它是一种在 Java 虚拟机(JVM)层面实现的逻辑线程,不直接和操作系统的物理线程一一对应 操作系统线程、普通线程(Java 线程)和虚拟线程的关系如下:虚拟线程使用虚拟线程的创建方式,主要有以下 4 种:Thread.startVirtualThread(Runnable task)Thread.ofVirtual (()->{ System.out.println("Do virtual thread.");});// 运行虚拟线程vt.start();3.factory先创建虚拟线程工厂,然后再使用工厂创建虚拟线程 普通线程默认创建的是用户线程(而守护线程),而虚拟线程是守护线程,并且其守护线程的属性不能被修改,如果修改就会报错,如下图所示:虚拟线程由 JVM 调度和使用,避免了普通线程频繁切换的性能开销,所以相比于普通的线程来说 小结线程是轻量级的进程,而虚拟线程则是轻量级的线程虚拟线程是 JVM 层面实现的逻辑线程,不直接和操作系统的物理线程一一对应,因此使用它可以减少线程上下文切换所带来的性能开销。

    1.1K10编辑于 2023-12-20
  • 来自专栏技术分享

    JDK23--虚拟线程

    Java23下载地址:https://www.oracle.com/cn/java/technologies/downloads/虚拟线程的特点 轻量级每个虚拟线程的创建和销毁成本非常低,可与协程的成本相媲美 阻塞与非阻塞兼容 虚拟线程支持阻塞式代码风格,即便线程处于阻塞状态,也不会浪费操作系统资源,因为虚拟线程在阻塞时会自动挂起并释放底层资源。同时兼容现有的非阻塞 I/O,开发者无需改变已有的代码习惯。 透明性 使用虚拟线程无需学习新的 API,开发者可以像使用传统线程一样简单地操作虚拟线程。 每个虚拟线程可以由一个或多个操作系统线程动态映射和执行,从而提升资源利用率。虚拟线程的应用场景 高并发网络应用 适用于需要处理大量用户请求的服务器,例如 Web 服务、聊天系统等。 如何使用虚拟线程从 JDK 19 开始,虚拟线程作为预览特性引入,JDK 21 及之后版本正式稳定。

    53620编辑于 2025-01-10
  • 来自专栏FunTester

    Spring WebClient + 虚拟线程实战

    Spring WebClient 与虚拟线程:实战集成指南 在上一篇文章中,我们介绍了 JDK HttpClient 和虚拟线程的基础概念。 与 Spring WebClient 集成 你也可以增强 Spring WebClient,使其使用虚拟线程,将 Spring 强大的生态系统与虚拟线程的可扩展性结合起来。 这样你既能享受 Spring 的便利,又能获得虚拟线程的性能优势。 虚拟线程消除了简单性(每个请求一个线程)与可扩展性之间的传统权衡。 虚拟线程使这种模式高效且简单。

    24010编辑于 2025-12-21
  • 来自专栏猫头虎博客专区

    虚拟线程(Virtual Threads):什么是JDK 21中的虚拟线程?如何实现轻量级线程管理?

    虚拟线程(Virtual Threads):什么是JDK 21中的虚拟线程?如何实现轻量级线程管理? 引言 在Java中,传统线程由操作系统管理,虽然功能强大,但开销较大,无法高效处理海量并发任务。 核心概念:什么是虚拟线程? 1. 定义与特性 虚拟线程(Virtual Threads) 是一种由JVM而非操作系统直接管理的线程。 启用虚拟线程的环境要求 虚拟线程是JDK 21正式发布的新特性,确保以下环境支持: JDK 21及以上版本。 --enable-preview 标志以启用虚拟线程。 2. try (var executor = Executors.newVirtualThreadPerTaskExecutor()) { for (int i = 1; i <= 10 A:虚拟线程适合高并发任务,但在一些场景(如与本地代码交互、计算密集型任务)仍需使用传统线程。 Q:虚拟线程是否线程安全?

    2.4K11编辑于 2024-12-20
  • 来自专栏JusterZhu

    Part10-线程

    1.线程是一个可执行的路径,它可以独立于其他线程执行。 2.每个线程都在操作系统的进程内执行,而操作系统进程提供了程序运行的独立环境。 3.单线程应用,在进程的独立环境里只跑一个线程,所以该线程拥有独占权。 4.多线程应用,单个进程中会跑多个线程,他们会共享当前的执行环境(内存)等。 5.进程和线程的对应关系,一个进程可以拥有多个线程,多个线程只能属于一个进程。 例如:一个非常耗时的操作(读数据库、复杂耗时的计算),如果只用主线程执行UI线程会“假死”专业术语叫线程阻塞。 这时候的解决办法就是单独开一个线程去执行这个耗时操作。这个时候处理的数据就可被称作是共享状态。

    7810编辑于 2022-12-07
  • 来自专栏得物技术

    虚拟线程原理及性能分析

    载体线程(Carrier Thread):指真正负责执行虚拟线程中任务的平台线程。一个虚拟线程装载到一个平台线程之后,那么这个平台线程就被称为虚拟线程的载体线程。 **这意味着许多虚拟线程可以在同一个平台线程上运行他们的 Java 代码,共享同一个平台线程。**同时虚拟线程的成本很低,虚拟线程的数量可以比平台线程的数量大得多。 unmount 操作:虚拟线程从平台线程卸载,此时虚拟线程的任务还没有执行完成,所以虚拟线程中包装的 Continuation 栈数据帧会会留在堆内存中。 测试流程Jmeter 开启 500 个线程去并行发起请求。每个线程将等待请求响应后再发起下一次请求,单次请求超时时间为 10s,测试时间持续 60s。 要想使用虚拟线程,需要先在启动参数中加上 --enable-preview,同时 Tomcat 在 10 版本已支持虚拟线程,我们只需要替换 Tomcat 的平台线程池为虚拟线程池即可。

    1.8K41编辑于 2023-12-06
  • 来自专栏芋道源码

    SpringBoot 物理线程虚拟线程、Webflux 性能全面对比!

    介绍 在本文中,我们将深入探讨所有同级产品之间的友好比较,即具有「物理线程虚拟线程和 Webflux 的 SpringBoot」 ,重点关注它们在特定用例场景中的性能。 —它在虚拟线程而不是传统的物理线程上运行。 虚拟线程是并发领域的游戏规则改变者。这些轻量级线程简化了开发、维护和调试高吞吐量并发应用程序的复杂任务。 虽然虚拟线程仍然在底层操作系统线程上运行,但它们带来了显着的效率改进。 当虚拟线程遇到阻塞 I/O 操作时,Java 运行时会暂时挂起它,从而释放关联的操作系统线程来为其他虚拟线程提供服务。这个优雅的解决方案优化了资源分配并增强了整体应用程序响应能力。 、虚拟线程和 Webflux 进行友好性能评估的背景下,了解关键的数据关系至关重要。

    97000编辑于 2025-05-10
  • 来自专栏Lambda

    10.JUC线程高级-线程八锁

    所谓线程八锁实际上对应于是否加上synchronized,是否加上static等8种常见情况,代码如下: 1.两个普通同步方法,两个线程,标准打印,结果:one two public class TestThread8Monitor } public static synchronized void getTwo(){ System.out.println("Two"); } } 以上就是线程的八种常见的情况 ,线程八锁的关键在于: 非静态方法的锁默认为this,静态方法的锁为对应的class实例(这里是Number.class) 某一个时刻内,只能有一个线程持有锁,无论有几个方法。 总结: ①一个对象里面如果有多个synchronized方法,某一个时刻内,只要一个线程去调用其中的一个synchronized方法了,其他的线程都只能等待,换句话说,某一时刻内,只能有唯一一个线程去访问这些 ②锁的是当前对象this,被锁定后,其他线程都不能进入到当前对象的其他的synchronized方法。 ③加个普通方法后发现和同步锁无关。

    24520编辑于 2022-04-13
  • 来自专栏实战docker

    支持JDK19虚拟线程的web框架,之三:观察运行中的虚拟线程

    :体验 支持JDK19虚拟线程的web框架,之二:完整开发一个支持虚拟线程的quarkus应用 本篇概览 本篇是《支持JDK19虚拟线程的web框架》系列的第三篇,在前面两篇咱们一起了解和体验了支持虚拟线程的 而并非宿主机的: import http from 'k6/http'; import { sleep, check } from 'k6'; export let options = { vus: 10 200, 'body size is > 0': (r) => r.body.length > 0, }); sleep(1); } 在压测期间去看JProfiler,如下图红框,新增了10 相信您已经很清楚了吧,我觉得是这三样: 调度器,scheduler(ForkJoin线程池中的线程) 执行虚拟线程任务的真实线程,carrier 虚拟线程 现在开始压测吧,继续用k6,如下图,脚本中的地址要改成使用虚拟线程的 来完成虚拟线程中的任务,等到这些任务执行完毕,所有真实线程虚拟线程都被结束,不再存活 至此,借助JProfiler观察常规线程虚拟线程的实战就完成了,经过了这些理论结合实际的操作和分析,相信您对虚拟线程的认知已经更具体和全面

    84140编辑于 2022-11-03
  • 来自专栏架构狂人

    一文讲透虚拟线程

    虚拟线程和普通线程的区别 “虚拟线程,望文生义,它是“假”的,它不直接调度操作系统的线程,而是由 JVM 再提供一层线程的接口抽象,由普通线程调度,即一个普通的操作系统线程可以调度成千上万个虚拟线程虚拟线程比普通线程的消耗要小得多得多,在内存足够的情况下,我们甚至可以创建上百万的虚拟线程,这在之前(Java19 以前)是不可能的。 SpringBoot 使用虚拟线程 下面我们会在 SpringBoot 中使用虚拟线程,将默认的异步线程池和 http 处理线程池替换为虚拟线程,然后对比虚拟线程和普通线程的性能差异,你会发现差别就像马车换高铁 :678 秒左右,超过 10 分钟了 虚拟线程耗时:3.9 秒!! 下面再看下虚拟线程的表现: 「虚拟线程耗时」: 可以看到即使是最大耗时,也保持在 100ms 以下,即线程等待时间显著的减少,虚拟线程更好的利用了系统资源。

    1.1K10编辑于 2024-07-16
  • 网易面试:SpringBoot如何开启虚拟线程

    虚拟线程是一种在 Java 虚拟机(JVM)层面实现的逻辑线程,不直接和操作系统的物理线程一一对应,因此它可以减少上下文切换所带来的性能开销。 操作系统线程、普通线程(Java 线程)和虚拟线程的关系如下:1.虚拟线程使用虚拟线程的创建有以下 4 种方式:Thread.startVirtualThread(Runnable task)Thread.ofVirtual 普通线程默认创建的是用户线程(而守护线程),而虚拟线程是守护线程,并且其守护线程的属性不能被修改,如果修改就会报错,如下图所示:虚拟线程由 JVM 调度和使用,避免了普通线程频繁切换的性能开销,所以相比于普通的线程来说 PS:这里是虚拟线程执行器,不是虚拟线程池。 有了虚拟线程后还需要虚拟线程池吗?为什么?

    2K10编辑于 2024-06-12
  • 来自专栏朱永胜的私房菜

    JDK21更新内容:虚拟线程

    Virtual Threads(虚拟线程)是Java平台的一项新功能,它旨在改进Java中的并发编程模型。传统上,Java使用基于操作系统线程的并发模型,每个线程都需要分配一个操作系统线程来执行。 具体而言,当一个Java应用程序创建一个Virtual Thread时,JVM会为其分配一个虚拟线程(也称为轻量级线程)。这些虚拟线程由协作调度器管理,并在需要时与操作系统线程进行绑定。 协作调度器负责决定哪个虚拟线程可以运行以及何时切换虚拟线程。 Fork/Join框架是Virtual Threads的另一个关键组件。 executor = (ThreadPoolExecutor) Executors.newVirtualThreadExecutor();                  for (int i = 0; i < 10 它通过引入轻量级的虚拟线程,并利用协作调度器和Fork/Join框架来提供高效的并发执行。

    1.2K70编辑于 2023-09-25
  • 来自专栏FunTester

    JDK HttpClient 与虚拟线程入门指南

    简单来说,以前你要么写复杂的异步代码,要么忍受线程资源限制,现在虚拟线程让你鱼和熊掌兼得。 )) // 设置连接超时为 10 秒 / Set connection timeout to 10 seconds .build(); // 构建 HTTP 请求,设置 URI 和请求头 / 想象一下,如果你的应用需要处理 10 万个并发请求,用传统线程的话,光内存就要吃掉 100-200 GB,这显然不现实。 虚拟线程是轻量级的用户模式线程,由 JVM 而非操作系统管理。 这就像传统线程是雇佣全职员工,成本高;虚拟线程是雇佣临时工,按需分配,成本低。 我们做了个基准测试,对 10,000 个并发 HTTP 请求进行测试,结果如下: • 传统平台线程:8-10 秒,2-3 GB 内存(资源消耗大,速度慢) • 响应式 WebFlux:3-4 秒,500

    24710编辑于 2025-12-21
  • 来自专栏明天依旧可好的专栏

    win10虚拟桌面

    虚拟桌面是什么? 每个虚拟桌面可以被看成是一个独立的工作空间。 每创建一个虚拟桌面,就像打开了一个新的工作空间。 ---- 虚拟桌面可以干嘛? 假设这样一个情景:你在正用电脑处理事情窗口开得特别多,中途你有另外一件事情需要用电脑去处理。你不想中断手上的工作,关闭现在的电脑窗口。 这个时候就可以考虑虚拟桌面了,它可以干嘛呢,我们来看效果图,回到第一个桌面 ---- 相关快捷键: Win 键-Tab:打开「任务视图」,相当于点击「可视化入口」。 Win 键-Ctrl-D:创建新的虚拟桌面。 Win 键-Ctrl-F4:删除当前虚拟桌面。 Win 键-Ctrl-左键:切换到相邻左侧的虚拟桌面。 Win 键-Ctrl-右键:切换到相邻右侧的虚拟桌面。

    1.9K10发布于 2019-01-22
  • 来自专栏运维小白

    WIN10创建虚拟桌面

    1.win+Tab时间轴,可查看任务视图 时间轴可以看到这几天执行过的任务,查找比较方便 win+Ctrl+D 新建虚拟桌面-----win+Ctrl+F4关闭虚拟桌面 一个电脑桌面有时打开多个文档会看着眼花缭乱 ,这时就可以使用win+Ctrl+D来创建多个虚拟桌面 Win+Ctrl+←/→(左右方向键)切换虚拟桌面

    1.6K10编辑于 2021-12-28
  • 来自专栏wayn的程序开发

    2 分钟理解虚拟线程是什么

    (大家为了节约线程资源,也就有了线程池的概念) 什么是虚拟线程? 与平台线程一样,虚拟线程也是 java.lang.Thread 的一个实例对象。但是,虚拟线程并不依赖于特定的操作系统线程虚拟线程底层仍然在操作系统的线程上运行代码。 而在虚拟线程中调用阻塞 I/O 操作时,JVM 虽然也会挂起该虚拟线程,但是与平台线程不同的是,被挂起虚拟线程关联的操作系统线程是可以为其他虚拟线程继续服务的。 虚拟线程的实现方式与虚拟内存类似。 因此与平台线程消耗的资源很多不同,虚拟线程在使用时只需要很少的内存资源。单个 JVM 就可以轻松创建数百万个虚拟线程。 尽管虚拟线程支持线程局部变量和可继承的线程局部变量,但我们应该仔细考虑后再使用它们,因为单个 JVM 可能运行数百万个虚拟线程

    44300编辑于 2023-12-29
  • 来自专栏实战docker

    支持JDK19虚拟线程的web框架,之四:看源码,了解quarkus如何支持虚拟线程

    :体验 支持JDK19虚拟线程的web框架,之二:完整开发一个支持虚拟线程的quarkus应用 支持JDK19虚拟线程的web框架,之三:观察运行中的虚拟线程 本篇概览 本篇是《支持JDK19虚拟线程的 另外请放心,虽然quarkus源码复杂,但本文会做到十分克制,不会在虚拟线程之外的地方展开阅读和分析,以保证整篇文章都在聚焦虚拟线程, 本文主要由下图的内容构成,红色区域表示本篇核心:一个特别的Excutor executor.submit方法,这样就创建了虚拟线程,并在虚拟线程中执行业务逻辑: 现在去看创建VIRTUAL_EXECUTOR_SUPPLIER的代码就会特别清晰了,如下图,前面在JDK官方指导看到的 ,就会返回一个可用的executor,确保业务能执行下去 对于上图箭头3位置的做法,个人并不认同:我使用虚拟线程,就是想一口气创建成千上万线程,再肆无忌惮的使用,遇到不支持虚拟线程的场景,直接抛异常让我知道这条路走不通 后面更精彩 下一篇文章就是整个系列的终篇了,相比本文,终篇会简单很多,大家一起在轻松的氛围中畅谈线程技术的一个重要成员:ThreadLocal,看它在虚拟线程时代如何兴风作浪 你不孤单,欣宸原创一路相伴

    79330编辑于 2022-11-12
  • 来自专栏Java小白成长之路

    10次文章:深入线程

    一、同步 当多个线程访问同一个资源时,由于每个线程访问同一份资源的时候,会有时间差。 使用synchronized的基本原理是:当已经有线程进入资源时,此时计算机会给当前资源一把锁,锁住当前资源,其他的线程只能在外部进行等待,线程被阻塞挂起。 start(); t2.start(); t3.start(); } } class Web12306 implements Runnable{ private int num = 10 左青龙4 生产了:右白虎5 消费了:右白虎5 生产了:左青龙6 消费了:左青龙6 生产了:右白虎7 消费了:右白虎7 生产了:左青龙8 消费了:左青龙8 生产了:右白虎9 消费了:右白虎9 生产了:左青龙10 消费了:左青龙10 生产了:右白虎11 消费了:右白虎11 生产了:左青龙12 消费了:左青龙12 生产了:右白虎13 消费了:右白虎13 生产了:左青龙14 消费了:左青龙14 生产了:右白虎15

    43930发布于 2019-09-27
  • 来自专栏游戏开发司机

    UNIX(多线程):10---线程unique_lock(下)

    #include <list> #include <mutex> using namespace std; class A { public: //把收到的消息(玩家命令)加入到一个队列的线程 std::cout << "主线程结束" << std::endl; return 0; } 缺省情况下,unique_lock和lock_guard作用相同。 ,阻塞20秒,另一个线程由于拿不到锁,也跟着阻塞20秒。 std::cout << "主线程结束" << std::endl; return 0; } ? std::cout << "主线程结束" << std::endl; return 0; } ?

    59210发布于 2021-02-03
  • 来自专栏新码农博客

    Python:虚拟环境 - Windows10

    导读 Windows10系统下Python虚拟环境的安装使用。 1、系统环境 Windows10 2、安装虚拟环境 升级pip python -m pip install --upgrade pip 安装虚拟环境 pip install virtualenv==16.1 3、配置虚拟环境 默认创建的虚拟环境的路径在 C:\Users\Administrator\Envs 4、虚拟环境操作 mkvirtualenv env_name # env_name为你要创建的虚拟环境的名字 \AppData\Local\Programs\Python\Python36\python.exe python36_ 查看安装的所有虚拟环境 workon 进入虚拟环境 workon env_nam 退出虚拟环境 deactivate 删除虚拟环境 rmvirtualenv env_nam

    58920发布于 2020-04-17
领券