JDK 21 LTS 版本重大特性详解
· 阅读需 11 分钟
Java 21 是继 JDK 17 之后的又一个长期支持版本(LTS),于2023年9月19日正式发布。这个版本带来了多个重要特性的正式发布,以及一些新的预览特性。让我们一起深入了解这些新特性。
1. 虚拟线程(正式发布)
虚拟线程终于在 JDK 21 中正式发布,这是 Java 并发编程的一个重大突破:
public class VirtualThreadDemo {
public static void main(String[] args) throws Exception {
// 创建单个虚拟线程
Thread vThread = Thread.startVirtualThread(() -> {
System.out.println("在虚拟线程中运行");
});
// 使用虚拟线程执行器
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
// 提交大量任务
IntStream.range(0, 10_000).forEach(i -> {
executor.submit(() -> {
// 模拟数据库操作
processDatabase(i);
return i;
});
});
}
// 使用结构化并发
try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
// 并行执行多个微服务调用
Future<String> service1 = scope.fork(() -> callMicroservice("service1"));
Future<String> service2 = scope.fork(() -> callMicroservice("service2"));
Future<String> service3 = scope.fork(() -> callMicroservice("service3"));
try {
scope.join(); // 等待所有任务完成
scope.throwIfFailed(); // 如果有任务失败则抛出异常
// 处理结果
processResults(
service1.resultNow(),
service2.resultNow(),
service3.resultNow()
);
} catch (Exception e) {
System.err.println("服务调用失败:" + e.getMessage());
throw e;
}
}
}
// 模拟数据库操作
private static void processDatabase(int id) {
try {
// 模拟网络延迟
Thread.sleep(Duration.ofMillis(100));
System.out.printf("处理数据库记录 %d%n", id);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
throw new RuntimeException(e);
}
}
// 模拟微服务调用
private static String callMicroservice(String name) throws Exception {
// 模拟网络延迟
Thread.sleep(Duration.ofMillis(200));
return name + " 响应";
}
// 处理微服务结果
private static void processResults(String... results) {
System.out.println("处理服务响应:" + String.join(", ", results));
}
// 展示虚拟线程与平台线程的区别
static void threadComparison() throws Exception {
// 使用平台线程
try (var executor = Executors.newFixedThreadPool(100)) {
// 提交任务...
}
// 使用虚拟线程
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
// 提交任务...
}
// 虚拟线程的线程本地变量
ThreadLocal<String> threadLocal = new ThreadLocal<>();
Thread.startVirtualThread(() -> {
threadLocal.set("虚拟线程的值");
System.out.println(threadLocal.get());
}).join();
}
}
主要特点:
- 轻量级线程实现
- 高效的并发处理
- 自动线程管理
- 与现有代码兼容
- 改进的性能和可伸缩性