官网地址
https://openjdk.org/projects/jdk/21/
思维导图
虚拟线程
一、新特性功能介绍
- 字符串模版
新的字符串插值语法允许在字符串中嵌入表达式,使用${expression}的形式。这样可以更方便地将变量或表达式的值嵌入到字符串中,而无需使用字符串连接操作符。例如:
String name = "John";
int age = 25;
String message = STR."My name is \{name} and I am \{age} years old.";
System.out.println(message);
2)多行模板表达式
String title = "My Web Page";
String text = "Hello, world";
String html = STR."""
<html>
<head>
<title>\{title}</title>
</head>
<body>
<p>\{text}</p>
</body>
</html>
3)字符串模板中使用嵌入的表达式进行计算和自增操作
int index = 0;
String data = STR."\{index++}, \{index++}, \{index++}, \{index++}";
4)字符串模板中使用嵌入的表达式来访问数组元素
String[] fruit = { "apples", "oranges", "peaches" };
String s = STR."\{fruit[0]}, \{STR."\{fruit[1]}, \{fruit[2]}"}";
二、顺序集合
针对于元素在集合中有具体的位置的顺序集合例如 :ArrayList、LinkedHashSet、LinkedHashMap 等 。
JDK 21 新增了三个接口:SequencedCollection、SequencedSet SequencedMap 提供了快速获取、添加、删除头尾元素以及反转集合中元素的操作。
SequencedCollection
SequencedSet
SequencedMap
三、虚拟线程
1 背景
JDK21 在 9 月 19 号正式发布,带来了较多亮点,其中虚拟线程备受瞩目,毫不夸张的说,它改变了高吞吐代码的编写方式,只需要小小的变动就可以让目前的 IO 密集型程序的吞吐量得到提升,写出高吞吐量的代码不再困难。
2 线程术语定义
操作系统线程(OS Thread):由操作系统管理,是操作系统调度的基本单位。
平台线程(Platform Thread):Java.Lang.Thread 类的每个实例,都是一个平台线程,是 Java 对操作系统线程的包装,与操作系统是 1:1 映射。
虚拟线程(Virtual Thread):一种轻量级,由 JVM 管理的线程。对应的实例 java.lang.VirtualThread 这个类。
载体线程(Carrier Thread):指真正负责执行虚拟线程中任务的平台线程。一个虚拟线程装载到一个平台线程之后,那么这个平台线程就被称为虚拟线程的载体线程。
虚拟线程定义:
JDK 中 java.lang.Thread 的每个实例都是一个平台线程。平台线程在底层操作系统线程上运行 Java 代码,并在代码的整个生命周期内独占操作系统线程,平台线程实例本质是由系统内核的线程调度程序进行调度,并且平台线程的数量受限于操作系统线程的数量。
而虚拟线程它不与特定的操作系统线程相绑定。它在平台线程上运行 Java 代码,但在代码的整个生命周期内不独占平台线程。这意味着许多虚拟线程可以在同一个平台线程上运行他们的 Java 代码,共享同一个平台线程。同时虚拟线程的成本很低,虚拟线程的数量可以比平台线程的数量大得多。
3 虚拟线程创建
方法一:直接创建虚拟线程
Thread vt = Thread.startVirtualThread(() -> {
System.out.println("hello wolrd virtual thread");
});
方法二:创建虚拟线程但不自动运行,手动调用start()开始运行
Thread.ofVirtual().unstarted(() -> {
System.out.println("hello wolrd virtual thread");
});
vt.start();
方法三:通过虚拟线程的 ThreadFactory 创建虚拟线程
ThreadFactory tf = Thread.ofVirtual().factory();
Thread vt = tf.newThread(() -> {
System.out.println("Start virtual thread...");
Thread.sleep(1000);
System.out.println("End virtual thread. ");
});
vt.start();
方法四:Executors.newVirtualThreadPer-TaskExecutor()
ExecutorService executor = Executors.newVirtualThreadPerTaskExecutor();
executor.submit(() -> {
System.out.println("Start virtual thread...");
Thread.sleep(1000);
System.out.println("End virtual thread.");
return true;
});
4 虚拟线程实现原理
- 轻量级与用户态实现
- 协作式调度器
- 连续传递样式
- 栈切换与内存管理
- 与操作系统线程的映射
- 任务管理和排队