
java的并发模型经历了从绿色线程到虚拟线程的演进。绿色线程采用m:1调度,将多个用户线程映射到一个操作系统线程,存在性能瓶颈。虚拟线程则引入m:n调度,将大量虚拟线程高效地调度到少量操作系统线程上运行,显著提升了并发应用的吞量和可扩展性,解决了传统绿色线程的局限性,是现代java平台轻量级并发的关键。
在Java平台中,线程是实现并发编程的基本单元。随着Java技术的发展,其对线程的实现和调度机制也经历了多次重要的演进。理解不同线程类型的调度模型对于编写高效、可扩展的并发应用至关重要。
平台线程是目前Java应用中最常见的线程类型,它直接封装了操作系统(OS)线程。这种模型采用1:1的映射关系,即一个Java平台线程对应一个操作系统线程。这意味着Java虚拟机(JVM)会为每个平台线程向操作系统请求一个内核线程,由操作系统负责其调度。
绿色线程是Java 1.1版本中引入的一种用户态线程实现,其设计目的是在操作系统线程尚不成熟和普及的年代提供轻量级并发。绿色线程的调度完全由JVM在用户空间完成,不依赖于操作系统内核。
虚拟线程是Java 19作为预览功能引入,并在Java 21中正式发布的一项重大创新(Project Loom)。它旨在解决平台线程创建和管理成本高昂的问题,从而实现极高并发量的轻量级线程。虚拟线程也是一种用户态线程,由JDK而非操作系统提供。
立即学习“Java免费学习笔记(深入)”;
下表清晰地展示了Java中不同线程类型的关键特性和调度模型:
| 线程类型 | 描述 | Java线程(M) : 操作系统线程(N) |
|---|---|---|
| 平台线程 | 直接封装操作系统线程。 | 1:1 |
| 绿色线程 | 在单个操作系统线程上运行多个用户线程。 | M:1 |
| 虚拟线程 | 在多个操作系统线程上运行多个虚拟线程。 | M:N (M > N) |
在Java中创建和使用虚拟线程非常简单,与创建平台线程的API非常相似:
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadFactory;
public class VirtualThreadExample {
public static void main(String[] args) throws InterruptedException {
System.out.println("Starting main thread...");
// 方式一:使用Thread.ofVirtual()创建并启动一个虚拟线程
Thread virtualThread1 = Thread.ofVirtual().name("my-virtual-thread-1").start(() -> {
try {
System.out.println(Thread.currentThread().getName() + " is running.");
Thread.sleep(1000); // 模拟阻塞操作
System.out.println(Thread.currentThread().getName() + " finished.");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
// 方式二:使用Executors创建虚拟线程池
ThreadFactory virtualThreadFactory = Thread.ofVirtual().name("my-virtual-thread-", 0).factory();
try (var executor = Executors.newThreadPerTaskExecutor(virtualThreadFactory)) {
for (int i = 0; i < 5; i++) {
final int taskId = i;
executor.submit(() -> {
try {
System.out.println(Thread.currentThread().getName() + " - Task " + taskId + " is running.");
Thread.sleep(500 + taskId * 100); // 模拟不同时长的阻塞
System.out.println(Thread.currentThread().getName() + " - Task " + taskId + " finished.");
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
}
} // executor会自动关闭并等待所有任务完成
virtualThread1.join(); // 等待第一个虚拟线程完成
System.out.println("Main thread finished.");
}
}运行上述代码,你会发现尽管有多个虚拟线程在执行模拟阻塞操作,它们仍然能够高效地并发运行,并且输出的线程名会显示它们是虚拟线程。
虚拟线程是Java平台在并发领域的一次重大飞跃,它以轻量级、高吞吐量的特性,极大地简化了高并发应用的开发,同时保持了传统的编程模型。理解其与绿色线程和平台线程的区别,掌握其调度机制,是现代Java开发者必备的知识。
以上就是Java并发演进:从绿色线程到虚拟线程的调度机制解析的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号