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

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

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

    44900编辑于 2023-12-29
  • 来自专栏王磊的博客

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

    Java 中的虚拟线程,也叫做协程或“轻量级线程”,它诞生于 JDK 19(预览 API),正式发布于 JDK 21,它是一种在 Java 虚拟机(JVM)层面实现的逻辑线程,不直接和操作系统的物理线程一一对应 操作系统线程、普通线程(Java 线程)和虚拟线程的关系如下:虚拟线程使用虚拟线程的创建方式,主要有以下 4 种:Thread.startVirtualThread(Runnable task)Thread.ofVirtual ("Do virtual thread.");});2.unstarted只创建虚拟线程,但不直接启动:// 创建虚拟线程Thread vt = Thread.ofVirtual().unstarted (()->{ System.out.println("Do virtual thread.");});// 运行虚拟线程vt.start();3.factory先创建虚拟线程工厂,然后再使用工厂创建虚拟线程 小结线程是轻量级的进程,而虚拟线程则是轻量级的线程虚拟线程是 JVM 层面实现的逻辑线程,不直接和操作系统的物理线程一一对应,因此使用它可以减少线程上下文切换所带来的性能开销。

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

    JDK23--虚拟线程

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

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

    Spring WebClient + 虚拟线程实战

    Spring WebClient 与虚拟线程:实战集成指南 在上一篇文章中,我们介绍了 JDK HttpClient 和虚拟线程的基础概念。 与 Spring WebClient 集成 你也可以增强 Spring WebClient,使其使用虚拟线程,将 Spring 强大的生态系统与虚拟线程的可扩展性结合起来。 虽然虚拟线程让你可以创建大量并发请求,但网络连接和服务器资源仍然是有限的: // 创建使用虚拟线程的 HTTP 客户端,支持 HTTP/2 多路复用 // Create HTTP client using 虚拟线程消除了简单性(每个请求一个线程)与可扩展性之间的传统权衡。 虚拟线程使这种模式高效且简单。

    26110编辑于 2025-12-21
  • 来自专栏技术杂记

    线程2

    pshared, unsigned int __value) __THROW; __sem 指向信号量结构的一个指针 __pshared 不为0时此信号量在进程间共享,否则只能为当前进程的所有线程共享 __newthread 指向线程标识符的指针 __attr 设置线程属性,一般配置为NULL (*__start_routine) (void *) 线程运行函数的起始地址 __arg 运行函数的参数 with __THROW. */ extern int pthread_join (pthread_t __th, void **__thread_return); 调用它的函数将一直等待到被等待的线程结束为止 ,当函数返回时,被等待线程的资源被收回 __th 被等待的线程标识符 __thread_return 为一个用户定义的指针,它可以用来存储被等待线程的返回值 ---- sem_wait semaphore.h 信号量的值没有更改,-1 被返回,并设置errno 来指明错误 EINVAL  sem 不是一个有效的信号量  EOVERFLOW 信号量允许的最大值将要被超过 ---- 总结 以下函数可以进行信号量和线程的创建与控制

    45910发布于 2021-09-15
  • 来自专栏猫头虎博客专区

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

    与传统线程兼容:完全兼容现有的线程API,无需修改代码即可引入虚拟线程2. 启用虚拟线程的环境要求 虚拟线程是JDK 21正式发布的新特性,确保以下环境支持: JDK 21及以上版本。 --enable-preview 标志以启用虚拟线程2. } } 输出结果: 虚拟线程执行任务: VirtualThread-1 示例2:使用虚拟线程池 import java.util.concurrent.ExecutorService; import } } 输出结果(部分示意): 执行任务 1,线程名: VirtualThread-1 执行任务 2线程名: VirtualThread-2 执行任务 3,线程名: VirtualThread IO密集型任务 虚拟线程在处理大量短生命周期的IO任务时表现尤为优越,例如: HTTP请求处理。 数据库查询。 2.

    2.5K11编辑于 2024-12-20
  • 来自专栏cloudskyme

    虚拟化技术(2)——存储虚拟

    根据在I/O路径中实现虚拟化的位置不同,虚拟化存储可以分为主机的虚拟存储、网络的虚拟存储、存储设备的虚拟存储。根据控制路径和数据路径的不同,虚拟化存储分为对称虚拟化与不对称虚拟化。 三层模型 根据云存储系统的构成和特点,可将虚拟化存储的模型分为三层:物理设备虚拟化层、存储节点虚拟化层、存储区域网络虚拟化层。 这个虚拟化层由存储节点虚拟模块在存储节点内部实现,对下管理按需分配的存储设备,对上支持存储区域网络虚拟化层。 这个虚拟化层由虚拟存储管理模块在虚拟存储管理服务器上实现,以带外虚拟化方式管理虚拟存储系统的资源分配,为虚拟磁盘管理提供地址映射、查询等服务。 利用虚拟化技术,可以在统一的虚拟化基础架构中,实现跨数据中心的虚拟化管理。 政府信息系统:政府数据存储系统的建设正受到前所未有的重视。

    7.9K60发布于 2018-03-20
  • 来自专栏得物技术

    虚拟线程原理及性能分析

    载体线程(Carrier Thread):指真正负责执行虚拟线程中任务的平台线程。一个虚拟线程装载到一个平台线程之后,那么这个平台线程就被称为虚拟线程的载体线程。 **这意味着许多虚拟线程可以在同一个平台线程上运行他们的 Java 代码,共享同一个平台线程。**同时虚拟线程的成本很低,虚拟线程的数量可以比平台线程的数量大得多。 unmount 操作:虚拟线程从平台线程卸载,此时虚拟线程的任务还没有执行完成,所以虚拟线程中包装的 Continuation 栈数据帧会会留在堆内存中。 一个虚拟线程被分配平台线程,该平台线程作为载体线程执行虚拟线程中的任务。虚拟线程运行其 Continuation,Mount(挂载)平台线程后,最终执行 Runnable 包装的用户实际任务。 结束");});System.out.println("1 run");// 第一次执行Continuation.runcontinuation.run();System.out.println("2

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

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

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

    1K00编辑于 2025-05-10
  • 来自专栏Android知识点总结

    线程2

    Thread ~ thread.start期间 2.Runnable: 可执行态: 可被CPU调度执行期间。 结果分析:注02:29代表当前时刻的分秒,即2分29秒 ---->[运行结果]---------------------- 02:29:小汽车开始启动,在路上跑 02:29:小汽车跑到终点 02:31: :53:小汽车跑到终点 3.当加锁睡眠时 在线程1中加synchronized(这里锁用sdf对象,你也可以任意) public class Main2 { static SimpleDateFormat 五、小结 1.需要补充的点: 1.关于synchronized锁这里不展开 2.关于synchronized锁对象需要一致,否则锁不住,然并卵。 2.简单比较 item 从属 是否释放锁 状态转变为 异常 sleep Thread 静态方法 NO 阻塞 InterruptedException wait Object 公共方法 YES 等待队列

    56220发布于 2020-04-30
  • 来自专栏Java实战博客

    线程2

    线程ID 编号取值1-1000 newFixedThreadPool() 50.037秒 打印日志如下: 当前线程名称pool-2-thread-1 当前线程名称pool-2-thread-2 当前线程名称 pool-2-thread-3 当前线程名称pool-2-thread-4 当前线程名称pool-2-thread-6 当前线程名称pool-2-thread-5 当前线程名称pool-2-thread -7 当前线程名称pool-2-thread-8 当前线程名称pool-2-thread-10 当前线程名称pool-2-thread-9 ... 当前线程名称pool-2-thread-1 当前线程名称pool-2-thread-2 ...... 当前线程名称pool-2-thread-7 当前线程名称pool-2-thread-8 当前线程名称pool-2-thread-10 当前线程名称pool-2-thread-9 源码分析 ExecutorService

    45920编辑于 2022-01-19
  • 来自专栏嘉嘉的博客

    虚拟赛-2总结

    洛谷虚拟赛-2的总结 分数 & 排名 预期分数: 100+80+100+0=280 实际分数: 60+90+0+0=150 排名12 分析 第一题么,看到数据范围觉得要开 long long,实际也在输入时开了

    23410编辑于 2023-02-23
  • 来自专栏CodeNone

    【多线程线程池源码(2

    废话不多说,开始我们的线程池源码的第二轮阅读。 回顾 简单回顾下上一篇线程池源码中涉及的两个方法,一个是execute() 执行任务的入口,还有一个是addWorker() 最通俗地理解就是是否需要添加新线程。 开始是一个循环,要么执行worker自带的第一个任务(firstTask),要么通过getTask() 获取任务 有任务首先得保证线程池是正常的,以下两种情况均调用wt.interrupt() 给「线程设置中断标志位 」 线程池处于STOP状态,也就是不接受新任务,也不执行队列中的任务 如果线程的标志位已经为true,那么清楚标志位,此时的线程池状态为STOP状态,这里看起来可能比较别扭,有了第一种情况为什么还要第二种 一进来也是一个死循环,可以先聚焦「什么时候会退出循环」,肯定是「不正常的情况」下会退出 当线程池状态不处于RUNNING或者SHUTDOWN的时候,或者是当线程处于SHUTDOWN但是工作队列中没有任务

    38330发布于 2021-08-10
  • 来自专栏实战docker

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

    :体验 支持JDK19虚拟线程的web框架,之二:完整开发一个支持虚拟线程的quarkus应用 本篇概览 本篇是《支持JDK19虚拟线程的web框架》系列的第三篇,在前面两篇咱们一起了解和体验了支持虚拟线程的 web服务,功能性能都试过,整个开发过程也完整执行,算是对quarkus和虚拟线程有了初步的了解,但也留下两个问题 虚拟线程和常规子线程的区别,究竟能不能看出来? ,就能看到当前应用进程内的所有线程,注意按照步骤2过滤一下,只看存活的线程 接下来,咱们就要用JProfiler来观察常规线程虚拟线程的区别了 先回忆一下,前文中,咱们开发的quarkus应用有两个 相信您已经很清楚了吧,我觉得是这三样: 调度器,scheduler(ForkJoin线程池中的线程) 执行虚拟线程任务的真实线程,carrier 虚拟线程 现在开始压测吧,继续用k6,如下图,脚本中的地址要改成使用虚拟线程的 来完成虚拟线程中的任务,等到这些任务执行完毕,所有真实线程虚拟线程都被结束,不再存活 至此,借助JProfiler观察常规线程虚拟线程的实战就完成了,经过了这些理论结合实际的操作和分析,相信您对虚拟线程的认知已经更具体和全面

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

    一文讲透虚拟线程

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

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

    虚拟线程是一种在 Java 虚拟机(JVM)层面实现的逻辑线程,不直接和操作系统的物理线程一一对应,因此它可以减少上下文切换所带来的性能开销。 操作系统线程、普通线程(Java 线程)和虚拟线程的关系如下:1.虚拟线程使用虚拟线程的创建有以下 4 种方式:Thread.startVirtualThread(Runnable task)Thread.ofVirtual ();executor.submit(()->{ System.out.println("Do virtual thread.");});2.虚拟线程 VS 普通线程虚拟线程和普通线程的区别主要体现在以下几点 PS:这里是虚拟线程执行器,不是虚拟线程池。 有了虚拟线程后还需要虚拟线程池吗?为什么?

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

    JDK21更新内容:虚拟线程

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

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

    JDK HttpClient 与虚拟线程入门指南

    简单来说,以前你要么写复杂的异步代码,要么忍受线程资源限制,现在虚拟线程让你鱼和熊掌兼得。 传统的平台线程成本高昂——每个线程消耗大量内存(通常为 1-2 MB),并且需要操作系统级别的上下文切换。这限制了应用程序最多只能使用数千个线程。 这就像传统线程是雇佣全职员工,成本高;虚拟线程是雇佣临时工,按需分配,成本低。 当将 JDK HttpClient 与虚拟线程集成时,魔法就发生了。 MB 内存(性能好,但代码复杂) • 虚拟线程 + HttpClient:3-4 秒,300 MB 内存(性能好,代码简单) 虚拟线程实现了响应式级别的性能,同时代码更易于阅读且是命令式的。

    29010编辑于 2025-12-21
  • 来自专栏指点的专栏

    Java 多线程2)---- 线程的控制

    如果你对线程的一些概念还不熟悉,建议先从第一篇文章看起:Java 多线程(1)— 初识线程,当然,大神请无视这句话。 这篇文章我们来看一下 Java 多线程中对线程的控制。 线程控制 其实对一个线程的控制简单来说无非 3 种:开启线程、暂停线程、停止线程: 开启线程我们上篇文章已经使用过了,就是一个当线程对象调用start() 方法后(start() 方法只能被调用一次 ),这个线程就进入就绪状态了,正在等待线程调度器调度该线程,而一旦线程调度器调度了该线程之后,该线程便可获得 CPU 资源,进入正在运行状态。 如果我们需要暂停一个正在执行的线程时,我们可以通过调用该线程对象的 sleep(long millis) 方法来让该线程休眠指定的秒数,调用这个方法之后线程将会让出 CPU 进入休眠,休眠完成之后的线程并不会直接获得 其他API 好了,到这里我们已经把如何开启一个线程、暂停一个线程和如何安全的结束一个线程介绍完了。

    88840发布于 2019-01-18
  • 来自专栏从零学习云计算

    Java 多线程学习(2)——停止线程

    重新系统的学习一下Java多线程部分。参考书籍为《java多线程编程核心技术》。 在Java中,有以下三种方法可以终止正在运行的线程: 使用退出标志,使线程正常退出,即run方法完成后,线程终止; 使用stop方法,强行终止线程,不推荐使用,可能会产生不可预料的后果; 使用interrupt 方法中断线程。 使用interrupt方法停止线程 interrupt()方法仅仅是在当前线程中打了一个停止标记,并不会真正的停止线程。 判断线程是否是停止状态 Thread.java类中提供了两种方法判断线程是否是停止状态: this.interrupted():测试当前线程是否已经中断。执行后具有将状态置清除为false的功能。

    85930发布于 2019-05-26
领券