• 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);
    • 1
    • 2
    • 3
    • 4
    • 5

    也可以使用Thread.ofVirtual()来创建,这里还可以设置一些属性,比如:线程名称。具体如下代码:

    Thread.ofVirtual()
            .name("didispace-virtual-thread")
            .start(runnable);
    • 1
    • 2

    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);
        }
    }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    上述代码在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;
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这段代码创建了一个虚拟线程工厂,每个虚拟线程都会以didispace为前缀、以数字结尾(从0开始累加)的名称。

    小结

    上面我们介绍了虚拟线程的创建和使用,而我们大多数Java开发者都基于Spring来开发具体业务应用,所以很多场景下可能都不太涉及手工创建的操作。所以,对于虚拟线程的概念,你只需要有一个基本的认识。所以,在文章的最后,做一个小结,以方便大家理解和记忆:

    • 虚拟线程是由JVM管理的轻量级线程。
    • 虚拟线程不需要任何显式分配或调度。
    • 虚拟线程非常适合I/O密集型任务或需要大量并行性的任务。
    • 虚拟线程也可以用来实现异步操作。

    另外,值得注意的是,虽然虚拟线程可以在并发性和可扩展性方面提供显着的帮助,但它们并不总是适合所有场景。有些需要大量计算的任务,并不一定在虚拟线程中运行更好,因为虚拟线程也有上下文切换的开。具体情况还是需要通过测试评测,以找到最优解。

    如果您学习过程中如遇困难?可以加入我们超高质量的技术交流群,参与交流与讨论,更好的学习与进步!另外,不要走开,关注我!持续更新Java新特性专栏

    参考资料

    欢迎关注我的公众号:程序猿DD。前沿技术早知道,弯道超车有希望!积累超车资本,从关注DD开始!

  • 相关阅读:
    【Swift】【json】通过json字符串直接生成swift实体类
    【第7天】SQL进阶-插入记录(SQL 小虚竹)
    BootStrap中的布局
    多叉树+图实现简单业务流程
    程序员的护城河:技术、创新还是沟通?
    Qt应用开发(基础篇)——工具按钮类 QToolButton
    nginx配置中$http_host、$host、$host$proxy_port和$host$server_port区别
    TADHE车灯专用修复UV胶--汽车灯罩修复领域之光
    错误模块路径: ...\v4.0.30319\clr.dll,v4.0.30319 .NET 运行时中出现内部错误,进程终止,退出代码为 80131506。
    切糕 小白月赛45
  • 原文地址:https://blog.csdn.net/dyc87112/article/details/133377754