我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java21虚拟线程实践

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java21虚拟线程实践

文章目录


  就在前几天,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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java21虚拟线程实践

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

java虚拟线程怎么实现

Java虚拟线程实现Java虚拟线程通过协程、栈分裂、非抢占式调度和阻塞API转换来实现。它利用协程在单个操作系统线程中同时执行多个任务,以提高性能和可扩展性。虚拟线程调度程序管理虚拟线程的执行,栈管理用于维护每个线程的栈,而阻塞API转换器将阻塞API转换为非阻塞操作。虚拟线程具有轻量级、高并发、可扩展性和非阻塞的优势,使其成为提升应用程序并行性和响应速度的理想选择。
java虚拟线程怎么实现
2024-04-11

java虚拟线程怎么实现

在Java中,可以通过以下方式实现虚拟线程:1. 继承Thread类:创建一个继承自Thread类的子类,重写run()方法来定义线程的执行逻辑。然后通过调用start()方法来启动线程。示例代码:```javapublic class M
2023-09-21

java虚拟线程怎么应用

Java虚拟线程的应用Java虚拟线程提供高性能、可伸缩性和隔离性,非常适合I/O密集型、计算密集型和事件处理任务。通过轻量级的线程创建和销毁,虚拟线程可优化微服务、游戏开发和并发编程。JavaAPI提供易于使用的创建、管理和调度功能,而其用户空间实现则保证了效率和可扩展性。最佳实践包括避免阻塞、限制线程数量、使用线程池和监控性能。
java虚拟线程怎么应用
2024-04-11

java虚拟线程怎么应用

Java虚拟线程,即Java虚拟机(JVM)中的线程,可以通过以下几种方式应用:1. 多线程编程:Java提供了多线程编程的支持,可以通过创建线程对象、实现Runnable接口或继承Thread类来创建线程,并通过调用start()方法启动
2023-09-21

java虚拟线程的实现方式是什么

Java虚拟机(JVM)使用操作系统线程来实现Java虚拟线程。JVM将Java线程映射到操作系统线程,并使用操作系统线程来执行Java线程的代码。这种实现方式被称为"一对一"(one-to-one)模型,即每个Java线程都需要一个对应的
2023-09-22

java虚拟线程的实现方式是什么

Java虚拟线程:高性能并发编程的变革Java19引入虚拟线程,提供轻量级并发编程模型。虚拟线程由虚拟机管理,消除了内核上下文切换,带来显著性能提升。它们基于绿线程、协程和执行上下文,并通过调度程序管理,在固定大小的线程池中执行。虚拟线程具有高性能、可扩展性、资源效率和可移植性,可用作ForkJoinPool和CompletableFutureAPI。需要注意的是,它们无法执行阻塞操作,需要并发保护,并且调试可能更复杂。
java虚拟线程的实现方式是什么
2024-04-12

C++开发经验分享:C++虚拟现实编程的实践经验

C++开发经验分享:C++虚拟现实编程的实践经验随着科技的不断进步,虚拟现实技术正日益成为当今技术领域的热点之一。虚拟现实技术通过模拟真实环境,为用户提供身临其境的全新体验。在虚拟现实技术中,C++是一种被广泛采用的编程语言,它具有高效、灵
C++开发经验分享:C++虚拟现实编程的实践经验
2023-11-22

java虚拟线程的特点有哪些

Java虚拟线程的特点:轻量级:低开销,占用内存少。协作调度:由JVM调度,可定制调度策略。无阻塞:等待I/O时不阻塞,提高并发性。无锁:使用原子变量和无锁数据结构,避免竞争条件。高吞吐量:可处理大量并发请求。可扩展:按需创建和销毁线程,实现资源优化。可移植:适用于所有支持Java的平台。兼容:与传统Java线程完全兼容。容易使用:API简单易用,便于开发人员创建和管理。广泛应用:适用于处理大量并发请求的应用程序,如Web服务器、数据库服务器等。
java虚拟线程的特点有哪些
2024-04-10

java虚拟线程的特点有哪些

Java虚拟线程的特点包括:1. 轻量级:Java虚拟线程是由Java虚拟机管理的,相对于操作系统线程来说,开启和销毁线程的代价较低。2. 高效性:Java虚拟线程的创建、销毁和切换等操作都由Java虚拟机自行管理,不需要操作系统的介入,因
2023-09-22

jdk虚拟线程的特点有哪些

JDK虚拟线程的特点如下:1. 轻量级:JDK虚拟线程是由JDK虚拟机管理的,相对于操作系统线程而言,创建和销毁的成本较低,所以可以创建大量的虚拟线程。2. 高效性:JDK虚拟线程的调度和切换是由JDK虚拟机来控制的,相比于操作系统线程,虚
2023-09-21

在虚拟机Linux上部署DB2pureScale的实践步骤

本篇内容介绍了“在虚拟机Linux上部署DB2pureScale的实践步骤”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  DB2 pure
2023-06-13

掌握虚拟选择器:最佳学习实践指南

在现代的网页设计中,CSS是不可或缺的一部分。它可以让我们为网页添加样式、布局和交互效果。虚拟选择器是CSS中一种非常强大和灵活的概念,它可以精确地选择和操作DOM元素。掌握虚拟选择器的最佳实践,对于成为一名优秀的前端开发人员来说是至关重要
掌握虚拟选择器:最佳学习实践指南
2024-01-15

Go语言多线程编程实践指南

Go语言多线程编程实践指南Go语言作为一种现代化的编程语言,自带优秀的并发支持,使得多线程编程变得非常简单和高效。本文将介绍如何使用Go语言进行多线程编程,并通过具体的代码示例展示其中的各种技巧和最佳实践。一、Go语言的并发模型在Go
Go语言多线程编程实践指南
2024-02-29

Golang多线程编程的最佳实践指南

Golang多线程编程的最佳实践指南Go语言(Golang)是一种快速、简单且强大的编程语言,具有优秀的并发编程能力。通过支持原生的goroutine和channel,Golang为开发者提供了一种简单而高效的方式来进行多线程编程。本文将
Golang多线程编程的最佳实践指南
2024-02-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录