首页 > 编程语言 >Java 21 新特性:虚拟线程(Virtual Threads)

Java 21 新特性:虚拟线程(Virtual Threads)

时间:2023-09-28 10:57:54浏览次数:34  
标签:runnable Java 21 Thread 创建 虚拟 线程

在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。第一时间了解前沿行业消息、分享深度技术干货、获取优质学习资源

标签:runnable,Java,21,Thread,创建,虚拟,线程
From: https://www.cnblogs.com/didispace/p/17735173.html

相关文章

  • java.lang.IllegalStateException: javax.websocket.server.ServerContainer not avai
    spring项目能正常运行,但是单元测试报错错误原因注册WebSocket的Bean与springboot内带tomcat冲突解决办法1.注释该类里面的代码(不推荐)2.@springBootTest注解添加webEnvironment=SpringBootTest.WebEnvironment.RANDOM_PORT@SpringBootTest注解中,给出了webEnvironment参......
  • Java的类加载顺序
    1.类加载器Java虚拟机的类加载过程是由类加载器(ClassLoader)来实现的。类加载器负责将类装载到内存中,并为其创建一个Class对象。Java虚拟机定义了三种类加载器,分别为BootstrapClassLoader、ExtensionClassLoader、SystemClassLoader,它们按照层次关系进行组织,而且每个类加载器......
  • ISO/ SAE 21434 道路车辆网络安全工程
    ISO/SAE21434道路车辆网络安全工程是全球首个面向汽车行业网络安全管理的国际标准,明确了网络安全风险管理以及产品全生命周期各阶段的工程要求.ISO/SAE21434标准明确了与网络安全相关的术语、目标、要求和指导方针,制定了一个结构化的抽象框架,以帮助包括整车制造商以及供应......
  • Java基础之变量
    一、Java中的变量1、什么是变量:变量就是存储数据的容器,是在内存中的一块存储空间,用来临时存储一个经常发生改变的数据。之所以是临时存储,是因为所有的计算机设备运行时的内存资源是非常有限的,所以需要不断的将不使用的数据清理。2、Java种数据的类型:变量是用来存储数据的,而数......
  • Java序列serialVersionUID字段
    Spring框架默认使用Java的序列化机制,也就是说,Spring默认使用Java的内置序列化器。Java的序列化机制中,每个序列化的对象都有一个serialVersionUID字段,这个字段用来标识序列化对象的版本。Java的序列化机制是这样的:当一个对象被序列化时,Java会先检查对象的类是否有一个名为"serialV......
  • 一文搞懂Java异步编程之FutureTask(转)
    背景Java异步编程的在实际开发中经常被用到,那么异步任务执行结束如何将结果通知到主线程或者其他任务呢?本文不探讨JUC包下的各类锁实现实现的任务同步或者通知。一、Thread狭隘的讲Java创建线程的方式只有一种,就是newThread实例。Thread本身是Runnable的实现并且它定义了Runna......
  • JAVA代码使用JNI的方式调用C/C++动态库
    JNI(javanativeinterface),通过JNI的方式调用动态库步骤比较麻烦,不用额外引入依赖,对java项目工程依赖侵入为0,类中含有native描述的方法都会与动态库去一一映射,能通过System.load()函数去加载动态库,这种方式主要使用的场景是java写好类(一般不是接口),让C或者C++去实现......
  • The 2021 China Collegiate Programming Contest (Harbin) JBEIDG
    The2021ChinaCollegiateProgrammingContest(Harbin)目录The2021ChinaCollegiateProgrammingContest(Harbin)VP概况J-LocalMinimumB-MagicalSubsequenceE-PowerandModuloI-PowerandZeroD-MathmasterG-DamagedBicycleVP概况队友不应该写签到,签到......
  • Java之包装类的算法小题的练习
     算法小题练习一:需求:键盘录入一些1~10日之间的整数,并添加到集合中。直到集合中所有数据和超过200为止。代码示例:publicclassTest1{publicstaticvoidmain(String[]args){/*键盘录入一些1~10日之间的整数,并添加到集合中。直到集合中所有数据和超......
  • 无涯教程-JavaScript - CHAR函数
    描述CHAR函数返回由数字指定的字符。使用CHAR将可能从其他类型的计算机上的文件中获得的代码页码转换为字符。语法CHAR(number)争论Argument描述Required/OptionalNumber1到255之间的数字,指定所需的字符。该字符来自Windows环境的ANSI字符集。RequiredNotes如......