返回顶部
首页 > 资讯 > 后端开发 > JAVA >Java21虚拟线程实践
  • 146
分享到

Java21虚拟线程实践

java 2023-09-30 08:09:12 146人浏览 薄情痞子
摘要

文章目录 虚拟线程的使用什么是虚拟线程虚拟线程和协程相同之处:不同之处: 总结   就在前几天,java21正式版发布了,作为继java17之后的又一个长期支持版本 (LTS),为我们

文章目录


  就在前几天,java21正式版发布了,作为继java17之后的又一个长期支持版本 (LTS),为我们带来了很多新的特性,其中我最感兴趣的就是虚拟线程(virtual thread),相信大家对虚拟线程也很好奇。趁着空闲时间安装了jdk21来体验一把,顺便把我查到的关于java21虚拟线程相关的资料也分享下。

虚拟线程的使用

  首先来看下虚拟线程怎么使用,jdk21在Thread类中,专门提供了虚拟线程和虚拟线程工厂的创建入口,我们挨个看下。首先就是虚拟线程的创建和启动,使用lambda也就几行代码:

        Thread.ofVirtual().start(() -> {            System.out.println("Hello, virtual thread!");        });        // 也可以指定虚拟线程的名字        Thread.ofVirtual().name("virtual thread").start(() -> {            System.out.println("Hello, virtual thread!");        });

  Thread也提供了虚拟线程工厂,有了虚拟线程工厂,我们就可以在ExecutorService中使用虚拟线程。当然Executors已经提供好了封装,我们直接调用即可:

        try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {            IntStream.range(1, 10_000).forEach(i -> {                executor.submit(() -> {                    Thread.sleep(Duration.ofSeconds(0));                    return i;                });            });        }

  可以看得出来,虚拟线程几乎没有啥使用门槛,那他到底和普通线程有啥区别?我在查阅了一些资料后,我的理解如下:(可能理解浅薄或者有些错误,请指正)

什么是虚拟线程

  虚拟线程是一种轻量化的线程封装,由JVM直接调度和管理。反之普通的线程其实是调用的操作系统的能力,对应的是操作系统级的线程。相对虚拟线程来说操作系统级的线程持有成本很高,而且受操作系统调度和管理的。实际在普通多线程情况下,如果出现IO阻塞,这个线程就必须得跟着阻塞,这个线程对应的操作系统就被阻塞,而他却持有大量的内存。另外,要处理大量的IO就得新建更多线程,而大量的线程会在操作系统调度时因上下文切换导致大量的CPU被浪费。

  如果我们能在某个普通线程在等待IO返回的情况下,让其运行其他的任务,是不是就可以用少量的线程处理大量的IO?思路很美好,那具体怎么实施呢!在计算机科学领域,解决问题最简单的方式就是加一层,比如操作系统中,代码访问内存中间就有一层虚拟内存,如果代码到线程中间加一层虚拟线程,每个虚拟线程只有在真正需要CPU运行的时候,才会被映射到真正的线程上去运行,而IO阻塞时会换其他非阻塞的虚拟线程上来,这样就不需要创建大量的线程了,而虚拟线程只需要持有少量的上下文信息即可。

  这种实现方式带来了很多优势,比如:

  • 轻量级:虚拟线程占用内存更少,创建和切换代价更低。
  • 支持异步:虚拟线程支持异步非阻塞编程模型。
  • 扩展性好:可以在少量线程上运行大量虚拟线程。
  • 无上下文切换:协程在同一线程中运行,没有线程上下文切换。

虚拟线程和协程

  Java21实际上在实现虚拟线程时,兼容了普通线程(不确定是否完全兼容),像ThreadLocal、Semaphore之类的工具完全可以在虚拟线程中使用,基本上大部分使用线程的地方应该都可以替换成虚拟线程,也就是说以后可以肆无忌惮创建虚拟线程而不用担心过多创建线程了。以上的内容看起来很像是Go或者python中的协程,但在medium上看到一篇文章,解释了Java中的虚拟线程和协程之间的异同,摘抄下来方便大家更深入理解,如果有兴趣也可以去看原文

相同之处:

  • 虚拟线程和协程都很轻量级,它们的创建和销毁开销小于传统的操作系统线程。
  • 虚拟线程和协程都可以通过暂停和恢复在线程之间切换,从而避免线程上下文切换的开销。
  • 虚拟线程和协程都可以以异步和非阻塞的方式处理任务,提高应用程序性能和响应速度。

不同之处:

  • 虚拟线程在JVM级别实现,而协程在语言级别实现。因此,虚拟线程的实现可以用于任何支持JVM的语言,而协程的实现需要特定编程语言的支持。
  • 虚拟线程是协程的基于线程的实现,因此可以使用线程相关的api,如ThreadLocal,Lock和Semaphore。协程不依赖于线程,通常需要特定的异步编程框架和API。
  • 虚拟线程的调度由JVM管理,而协程的调度由编程语言或异步编程框架管理。因此,虚拟线程可以更好地与其他线程合作,而协程更适合处理异步任务。

总结

  有了虚拟线程,我们可以用虚拟线程替换许多使用线程的场景,任何需要异步或者多线程运行的情况下,我们都直接直接扔给虚拟线程去运行,丝毫不用顾虑的过度创建线程的问题,但这里需要额外注意,对于CPU密集型的任务多线程或者多虚拟线程依旧是无法提升性能的。虚拟线程是否能完全替代普通线程,这点肯定是不可能的,比较很多时候还是需要操作系统去做任务调度的,而目前操作系统最小的调度单位依旧是线程。

  总之,Java21正式推迟了虚拟线程,我相信在很多高IO的场景下肯定可以提升性能的,至于具体能提升多少,还是有待于具体数据的。 最后用两句老梗来结束本篇文章。

他发任他发,我用Java8。
Java21这么好用的功能,希望在有生之年能在生产环境用上。

来源地址:https://blog.csdn.net/xindoo/article/details/133248452

--结束END--

本文标题: Java21虚拟线程实践

本文链接: https://lsjlt.com/news/421769.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java21虚拟线程实践
    文章目录 虚拟线程的使用什么是虚拟线程虚拟线程和协程相同之处:不同之处: 总结   就在前几天,java21正式版发布了,作为继java17之后的又一个长期支持版本 (LTS),为我们...
    99+
    2023-09-30
    java
  • java虚拟线程怎么实现
    在Java中,可以通过以下方式实现虚拟线程:1. 继承Thread类:创建一个继承自Thread类的子类,重写run()方法来定义线...
    99+
    2023-09-21
    java
  • GPU桌面虚拟化HyperV实践
      目录 创建虚拟机 添加GPU 刷入显卡驱动 创建虚拟机 a说科技:1台电脑当10台用,在家开网吧,显卡分割术,Gpu虚拟化 (下)https://www.bilibili.com/video/BV1Dm4y1A7XR/spm_id_...
    99+
    2023-10-18
    linux 运维 服务器
  • JDK21最终版协程实现之虚拟线程
    1 全新并发编程模式 JDK9 后的版本你觉得没必要折腾,我也认可,但是JDK21有必要关注。因为 JDK21 引入全新的并发编程模式。 一直沽名钓誉的GoLang吹得最厉害的就是协程了。JDK21 ...
    99+
    2023-10-11
    java 原力计划
  • java虚拟线程怎么应用
    Java虚拟线程,即Java虚拟机(JVM)中的线程,可以通过以下几种方式应用:1. 多线程编程:Java提供了多线程编程的支持,可...
    99+
    2023-09-21
    java
  • java虚拟线程的实现方式是什么
    Java虚拟机(JVM)使用操作系统线程来实现Java虚拟线程。JVM将Java线程映射到操作系统线程,并使用操作系统线程来执行Ja...
    99+
    2023-09-22
    Java
  • 多线虚拟主机
    在当今数码时代,网站扮演着企业宣传和信息传播的重要角色。然而,一个成功的网站不仅需要精心设计和内容,还需要具备高性能和可靠的网络托管。针对这一需求,多线虚拟主机成为了越来越多企业和个人网站的优选。 所谓多线虚拟主机,是指基于多线技术,一台...
    99+
    2024-01-23
    虚拟主机 虚拟主机知识
  • 虚拟主机双线
    随着互联网的迅猛发展,越来越多的企业和个人将自己的业务或创意展示在网上。为了确保网站的稳定性和访问速度,选择一家可靠的虚拟主机提供商变得至关重要。在众多的虚拟主机服务提供商中,虚拟主机双线成为了许多用户的优选,这种服务可以为用户提供更好的...
    99+
    2024-01-24
    虚拟主机双线 虚拟主机知识
  • C++开发经验分享:C++虚拟现实编程的实践经验
    C++开发经验分享:C++虚拟现实编程的实践经验随着科技的不断进步,虚拟现实技术正日益成为当今技术领域的热点之一。虚拟现实技术通过模拟真实环境,为用户提供身临其境的全新体验。在虚拟现实技术中,C++是一种被广泛采用的编程语言,它具有高效、灵...
    99+
    2023-11-22
    实践经验 C++ 开发 虚拟现实编程
  • java虚拟线程的特点有哪些
    Java虚拟线程的特点包括:1. 轻量级:Java虚拟线程是由Java虚拟机管理的,相对于操作系统线程来说,开启和销毁线程的代价较低...
    99+
    2023-09-22
    java
  • jdk虚拟线程的特点有哪些
    JDK虚拟线程的特点如下:1. 轻量级:JDK虚拟线程是由JDK虚拟机管理的,相对于操作系统线程而言,创建和销毁的成本较低,所以可以...
    99+
    2023-09-21
    jdk
  • 在虚拟机Linux上部署DB2pureScale的实践步骤
    本篇内容介绍了“在虚拟机Linux上部署DB2pureScale的实践步骤”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  DB2 pure...
    99+
    2023-06-13
  • 解析在Tomcat中启用虚拟线程特性
    目录前提引入依赖编程式初始化Tomcat暂时无法在SpringBoot体系中使用小结前提 趁着国庆前后阅读了虚拟线程相关的源码,写了一篇《虚拟线程 - VirtualThread源码...
    99+
    2024-04-02
  • 掌握虚拟选择器:最佳学习实践指南
    在现代的网页设计中,CSS是不可或缺的一部分。它可以让我们为网页添加样式、布局和交互效果。虚拟选择器是CSS中一种非常强大和灵活的概念,它可以精确地选择和操作DOM元素。掌握虚拟选择器的最佳实践,对于成为一名优秀的前端开发人员来...
    99+
    2024-01-15
    最佳实践 入门到精通 虚拟选择器学习
  • Go语言多线程编程实践指南
    Go语言多线程编程实践指南 Go语言作为一种现代化的编程语言,自带优秀的并发支持,使得多线程编程变得非常简单和高效。本文将介绍如何使用Go语言进行多线程编程,并通过具体的代码示例展示其...
    99+
    2024-02-29
    实践 多线程 go语言
  • 双线虚拟主机怎么用
    双线虚拟主机是指在两个不同的地理位置都有服务器资源的虚拟主机,可以通过不同的线路来提供服务。以下是双线虚拟主机的使用方法:1. 注册...
    99+
    2023-05-14
    双线虚拟主机 虚拟主机
  • PHP中的线程池和异步编程实践
    近年来,PHP 开发者们开发出许多并发编程的技术,其中又以线程池和异步编程应用最为广泛。本文将介绍线程池和异步编程的基本概念以及它们在 PHP 中的实践应用。 一、线程池的概念线程池是一种并发编程领域中常见的技术。它是由一组线程组成的线程集...
    99+
    2023-05-23
    线程池 异步编程 PHP
  • Golang多线程编程的最佳实践指南
    Golang多线程编程的最佳实践指南 Go语言(Golang)是一种快速、简单且强大的编程语言,具有优秀的并发编程能力。通过支持原生的goroutine和channel,Golang为...
    99+
    2024-02-29
    多线程 golang 实践指南 go语言 并发访问
  • 线程池在 Java 程序中的最佳实践
    线程池中的线程数应根据应用程序的特定需求确定。 过少的线程可能会导致性能问题,而过多的线程又会浪费资源。 理想的线程数通常与应用程序并发需求成正比。 2. 使用适当的线程池类型 固定大小线程池:用于处理稳定且可预测的工作负载。 可伸...
    99+
    2024-03-13
    线程池
  • JDK21中虚拟线程到底是什么?看完便知
    本文涉及到的技术:虚拟线程、结构化并发、线程池、TheadLocal,对原理感兴趣的可以直接跳到原理部分。 虚拟线程是JDK19中引入的,JDK21正式发布,我们先来看看虚拟线程的几种用法,然后再来分...
    99+
    2023-10-10
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作