Java 21 新特性:虚拟线程(Virtual Threads)
在Java 21中,引入了虚拟线程(Virtual Threads)来简化和增强并发性,这使得在Java中编程并发程序更容易、更高效。
虚拟线程,也称为“用户模式线程(user-mode threads)”或“纤程(fibers)”。该功能旨在简化并发编程并提供更好的可扩展性。虚拟线程是轻量级的,这意味着它们可以比传统线程创建更多数量,并且开销要少得多。这使得在自己的线程中运行单独任务或请求变得更加实用,即使在高吞吐量的程序中也是如此。
创建和使用虚拟线程
在Java 21中创建和使用虚拟线程有多种方法:
1. 使用静态构建器方法
Thread.startVirtualThread方法将可运行对象作为参数来创建,并立即启动虚拟线程,具体如下代码:
Runnable runnable = () -> {
System.out.println("Hello, www.didispace.com");
};
// 使用静态构建器方法
Thread virtualThread = Thread.startVirtualThread(runnable);
也可以使用Thread.ofVirtual()来创建,这里还可以设置一些属性,比如:线程名称。具体如下代码:
Thread.ofVirtual()
.name("didispace-virtual-thread")
.start(runnable);
2. 与ExecutorService结合使用
从Java 5开始,就推荐开发人员使用ExecutorServices而不是直接使用Thread类了。现在,Java 21中引入了使用虚拟线程,所以也有了新的ExecutorService来适配,看看下面的例子:
Runnable runnable = () -> {
System.out.println("Hello, www.didispace.com");
};
try (ExecutorService executorService = Executors.newVirtualThreadPerTaskExecutor()) {
for (int i = 0; i < 100; i++) {
executorService.submit(runnable);
}
}
上述代码在try代码块中创建了一个ExecutorServices,用来为每个提交的任务创建虚拟线程。
3. 使用虚拟线程工厂
开发者还可以创建一个生成虚拟线程的工厂来管理,具体看下面的例子例子:
Runnable runnable = () -> {
System.out.println("Hello, www.didispace.com");
};
ThreadFactory virtualThreadFactory = Thread.ofVirtual()
.name("didispace", 0)
.factory();
Thread factoryThread = virtualThreadFactory.newThread(runnable);
factoryThread.start;
这段代码创建了一个虚拟线程工厂,每个虚拟线程都会以didispace为前缀、以数字结尾(从0开始累加)的名称。
小结
上面我们介绍了虚拟线程的创建和使用,而我们大多数Java开发者都基于Spring来开发具体业务应用,所以很多场景下可能都不太涉及手工创建的操作。所以,对于虚拟线程的概念,你只需要有一个基本的认识。所以,在文章的最后,做一个小结,以方便大家理解和记忆:
- 虚拟线程是由JVM管理的轻量级线程。
- 虚拟线程不需要任何显式分配或调度。
- 虚拟线程非常适合I/O密集型任务或需要大量并行性的任务。
- 虚拟线程也可以用来实现异步操作。
另外,值得注意的是,虽然虚拟线程可以在并发性和可扩展性方面提供显着的帮助,但它们并不总是适合所有场景。有些需要大量计算的任务,并不一定在虚拟线程中运行更好,因为虚拟线程也有上下文切换的开。具体情况还是需要通过测试评测,以找到最优解。
如果您学习过程中如遇困难?可以加入我们超高质量的技术交流群,参与交流与讨论,更好的学习与进步!另外,不要走开,关注我!持续更新Java新特性专栏!
参考资料
欢迎关注我的公众号:程序猿DD。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源
Java 21 新特性:虚拟线程(Virtual Threads)的更多相关文章
- IBM Developer:Java 9 新特性概述
Author: 成富 Date: Dec 28, 2017 Category: IBM-Developer (20) Tags: Java (27) 原文地址:https://www.ibm.com/ ...
- Java 8 新特性——检视阅读
Java 8 新特性--检视阅读 参考 Java 8 新特性--菜鸟 Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 JavaScript 引擎,新的 ...
- Java 8 新特性——实践篇
Java 8 新特性--实践篇 参考 Java8新特性 重要更新:Lambda 表达式和Stream API Lambda 表达式 Lambda 表达式引入之前: 举个场景例子:当我们要对一个班级里的 ...
- Java 12 新特性介绍,快来补一补
Java 12 早在 2019 年 3 月 19 日发布,它不是一个长久支持(LTS)版本.在这之前我们已经介绍过其他版本的新特性,如果需要可以点击下面的链接进行阅读. Java 11 新特性介绍 J ...
- Spring 4支持的Java 8新特性一览
有众多新特性和函数库的Java 8发布之后,Spring 4.x已经支持其中的大部分.有些Java 8的新特性对Spring无影响,可以直接使用,但另有些新特性需要Spring的支持.本文将带您浏览S ...
- Java 8 新特性终极版
声明:本文翻译自Java 8 Features Tutorial – The ULTIMATE Guide,翻译过程中发现并发编程网已经有同学翻译过了:Java 8 特性 – 终极手册,我还是坚持自己 ...
- Java 8新特性前瞻
快端午小长假了,要上线的项目差不多完结了,终于有时间可以坐下来写篇博客了. 这是篇对我看到的java 8新特性的一些总结,也是自己学习过程的总结. 几乎可以说java 8是目前为止,自2004年jav ...
- Java 8新特性探究(八)精简的JRE详解
http://www.importnew.com/14926.html 首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 Java小组 工具资源 - 导航条 - 首页 所有文章 资讯 ...
- 【整理】Java 8新特性总结
闲语: 相比于今年三月份才发布的Java 10 ,发布已久的Java 8 已经算是老版本了(传闻Java 11将于9月25日发布....).然而很多报道表明:Java 9 和JJava10不是 LTS ...
- Java 8新特性之旅:使用Stream API处理集合
在这篇“Java 8新特性教程”系列文章中,我们会深入解释,并通过代码来展示,如何通过流来遍历集合,如何从集合和数组来创建流,以及怎么聚合流的值. 在之前的文章“遍历.过滤.处理集合及使用Lambda ...
随机推荐
- Scalpel:解构API复杂参数Fuzz的「手术刀」
Scalpel简介 Scalpel是一款自动化Web/API漏洞Fuzz引擎,该工具采用被动扫描的方式,通过流量中解析Web/API参数结构,对参数编码进行自动识别与解码,并基于树结构灵活控制注入位点 ...
- FPGA加速技术:在数据中心和云计算中的应用
目录 1. 引言 2. 技术原理及概念 3. 实现步骤与流程 3.1 准备工作:环境配置与依赖安装 3.2 核心模块实现 3.3 集成与测试 4. 应用示例与代码实现讲解 4.1. 应用场景介绍 4. ...
- 普通用户启动 supervisor 报 HTTP 错误(strace)
公司的开发对生产环境都有普通用户 www 的权限,采用堡垒机登录到生产环境的机器. 默认 supervisor 使用 root 用户启动,开发没有权限直接修改配置和操作 supervisor 管理的进 ...
- 2021级HAUT新生周赛题解汇总
2021级HAUT新生周赛(一)题解@张君毅:第一场 2021级HAUT新生周赛(二)题解@李亚凯:第二场 2021级HAUT新生周赛(三)题解@李晨曦:第三场 2021级HAUT新生周赛(四)题解@ ...
- openpyxl 设置某列单元格样式
1 # 边框线 2 border_set = Border(left=Side(border_style='thin', color='000000'), 3 right=Side(border_st ...
- Django链接数据库出现的错误以及解决方法
问题一:django.db.utils.OperationalError: (1045, "Access denied for user 'leo'@'localhost' (using p ...
- idea 2021新窗口打开工程
描述 Mac M1,IDEA 2017 有部分兼容性问题,遂对IDEA进行升级 idea 升级2021(IntelliJ IDEA 2021.3 (Community Edition)) 打开新工程, ...
- .Net Web API 005 Controller上传小文件
1.附属文件对象定义 一般情况下,系统里面的文件都会附属一个对象存在,例如用户的头像文件,会附属用户对象存在.邮件中的文件会附属邮件存在.所以在系统里面,我们会创建一个附属文件对象,命名为Attach ...
- 超详细的mysql总结(DQL)
上一篇文章总结了 DDL.DML的使用,这一篇文章把剩下的 DQL 加上~ DQL(Data Query Language)即数据库查询语言,用来查询所需要的信息,在查询的过程中,需要判断所查询的 ...
- BurpSuite设置上游代理访问内网
转载原文 原理知道了后,开始! 拿到B的shell后,添加路由 拿到B的shell后,开启sock4 在D主机上设置好 最后成功抓到包