Java 21时代的标志:虚拟线程带来的并发编程新境界

简介: Java 21时代的标志:虚拟线程带来的并发编程新境界

虚拟线程

在 Java 21 中,引入了虚拟线程(Virtual Threads)来简化和增强并发性,这使得在 Java 中编程并发程序更容易、更高效

虚拟线程,也称为 “用户模式线程(user-mode threads)” 或 “纤程(fibers)”。该功能旨在简化并发编程并提供更好的可扩展性。虚拟线程是轻量级的,这意味着它们可以比传统线程创建更多数量,并且开销要少得多。这使得在自己的线程中运行单独任务或请求变得更加实用,即使在高吞吐量的程序中也是如此。

在 Java 21 中创建和使用虚拟线程有多种方法:

使用静态构建器方法

Thread.startVirtualThread 方法将可运行对象作为参数来创建,并立即启动虚拟线程,具体如下代码:

Runnable runnable = () -> {
    System.out.println("Hello World");
};
// 使用静态构建器方法
Thread virtualThread = Thread.startVirtualThread(runnable);

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

Thread.ofVirtual()
        .name("my-virtual-thread")
        .start(runnable);

与 ExecutorService 结合使用

从 Java 5 开始,就推荐开发人员使用 ExecutorServices 而不是直接使用 Thread 类了。现在 Java 21 中引入了使用虚拟线程,所以也有了新的 ExecutorService 来适配,看看下面的例子:

Runnable runnable = () -> {
    System.out.println("Hello World");
};
try (ExecutorService executorService = Executors.newVirtualThreadPerTaskExecutor()) {
    for (int i = 0; i < 100; i++) {
        executorService.submit(runnable);
    }
}

上述代码在 try 代码块中创建了一个 ExecutorServices,用来为每个提交的任务创建虚拟线程。

使用虚拟线程工厂

开发者还可以创建一个生成虚拟线程的工厂来管理,具体看下面的例子例子:

Runnable runnable = () -> {
    System.out.println("Hello World");
};
ThreadFactory virtualThreadFactory = Thread.ofVirtual()
        .name("test", 0)
        .factory();
Thread factoryThread = virtualThreadFactory.newThread(runnable);
factoryThread.start();

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

小结

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

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

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

相关文章
|
1天前
|
缓存 监控 Java
深入理解Java并发编程:线程池的设计与实现
【5月更文挑战第23天】在现代软件开发中,多线程与并发编程是提高程序性能、响应速度和资源利用率的关键手段。Java语言提供了丰富的并发工具,其中线程池是管理线程资源、减少创建销毁开销、提高系统吞吐量的重要组件。本文将深入探讨线程池的核心概念、设计原理以及Java中的实现机制,帮助开发者更好地理解和应用线程池技术。
|
1天前
|
安全 Java 调度
Java多线程- synchronized关键字总结
Java多线程- synchronized关键字总结
11 0
|
1天前
|
存储 安全 Java
Java锁策略-Java多线程(4)
Java锁策略-Java多线程(4)
5 0
|
1天前
|
设计模式 安全 Java
Java多线程案例-Java多线程(3)
Java多线程案例-Java多线程(3)
8 1
|
1天前
|
存储 安全 Java
Java多线程安全风险-Java多线程(2)
Java多线程安全风险-Java多线程(2)
9 1
|
1天前
|
Java 调度
聊聊Java线程是个啥东西-Java多线程(1)
聊聊Java线程是个啥东西-Java多线程(1)
8 0
|
1天前
|
安全 Java 开发者
Java中的多线程编程与性能优化
【5月更文挑战第23天】在现代软件开发中,多线程编程是提高程序性能和响应速度的关键技术之一。本文将深入探讨Java中的多线程编程基础,包括线程的创建、启动、同步以及死锁问题,并针对多线程环境下的性能优化提出具体方法和建议。通过分析线程池的使用、锁优化策略以及JVM内存模型对多线程性能的影响,本文旨在为开发人员提供一个全面的多线程编程和性能调优指南。
|
10天前
|
安全 Java
深入理解Java并发编程:线程安全与性能优化
【2月更文挑战第22天】在Java并发编程中,线程安全和性能优化是两个重要的主题。本文将深入探讨这两个主题,包括线程安全的基本概念,如何实现线程安全,以及如何在保证线程安全的同时进行性能优化。
20 0
|
6天前
|
安全 Java 容器
Java一分钟之-并发编程:线程安全的集合类
【5月更文挑战第19天】Java提供线程安全集合类以解决并发环境中的数据一致性问题。例如,Vector是线程安全但效率低;可以使用Collections.synchronizedXxx将ArrayList或HashMap同步;ConcurrentHashMap是高效线程安全的映射;CopyOnWriteArrayList和CopyOnWriteArraySet适合读多写少场景;LinkedBlockingQueue是生产者-消费者模型中的线程安全队列。注意,过度同步可能影响性能,应尽量减少共享状态并利用并发工具类。
19 2
|
10天前
|
安全 Java
Java中的并发编程:理解并发性与线程安全
Java作为一种广泛应用的编程语言,在并发编程方面具有显著的优势和特点。本文将探讨Java中的并发编程概念,重点关注并发性与线程安全,并提供一些实用的技巧和建议,帮助开发人员更好地理解和应用Java中的并发机制。