Skip to content

Commit 5b33600

Browse files
committed
[docs update]完善虚拟线程的介绍
1 parent 6469d6c commit 5b33600

File tree

2 files changed

+65
-4
lines changed

2 files changed

+65
-4
lines changed

docs/java/new-features/java20.md

Lines changed: 55 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -208,13 +208,21 @@ JDK 20 中是第二次预览,由 [JEP 434](https://openjdk.org/jeps/434) 提
208208

209209
## JEP 436: 虚拟线程(第二次预览)
210210

211-
虚拟线程(Virtual Thread-)是 JDK 而不是 OS 实现的轻量级线程(Lightweight Process,LWP),许多虚拟线程共享同一个操作系统线程,虚拟线程的数量可以远大于操作系统线程的数量。
211+
虚拟线程(Virtual Thread)是 JDK 而不是 OS 实现的轻量级线程(Lightweight Process,LWP),由 JVM 调度。许多虚拟线程共享同一个操作系统线程,虚拟线程的数量可以远大于操作系统线程的数量。
212212

213-
虚拟线程在其他多线程语言中已经被证实是十分有用的,比如 Go 中的 Goroutine、Erlang 中的进程。
213+
在引入虚拟线程之前,`java.lang.Thread` 包已经支持所谓的平台线程,也就是没有虚拟线程之前,我们一直使用的线程。JVM 调度程序通过平台线程(载体线程)来管理虚拟线程,一个平台线程可以在不同的时间执行不同的虚拟线程(多个虚拟线程挂载在一个平台线程上),当虚拟线程被阻塞或等待时,平台线程可以切换到执行另一个虚拟线程。
214+
215+
虚拟线程、平台线程和系统内核线程的关系图如下所示(图源:[How to Use Java 19 Virtual Threads](https://medium.com/javarevisited/how-to-use-java-19-virtual-threads-c16a32bad5f7)):
214216

215-
虚拟线程避免了上下文切换的额外耗费,兼顾了多线程的优点,简化了高并发程序的复杂,可以有效减少编写、维护和观察高吞吐量并发应用程序的工作量。
217+
![虚拟线程、平台线程和系统内核线程的关系](https://oss.javaguide.cn/github/javaguide/java/new-features/virtual-threads-platform-threads-kernel-threads-relationship.png)
216218

217-
知乎有一个关于 Java 19 虚拟线程的讨论,感兴趣的可以去看看:https://www.zhihu.com/question/536743167
219+
关于平台线程和系统内核线程的对应关系多提一点:在 Windows 和 Linux 等主流操作系统中,Java 线程采用的是一对一的线程模型,也就是一个平台线程对应一个系统内核线程。Solaris 系统是一个特例,HotSpot VM 在 Solaris 上支持多对多和一对一。具体可以参考 R 大的回答: [JVM 中的线程模型是用户级的么?](https://www.zhihu.com/question/23096638/answer/29617153)
220+
221+
相比较于平台线程来说,虚拟线程是廉价且轻量级的,使用完后立即被销毁,因此它们不需要被重用或池化,每个任务可以有自己专属的虚拟线程来运行。虚拟线程暂停和恢复来实现线程之间的切换,避免了上下文切换的额外耗费,兼顾了多线程的优点,简化了高并发程序的复杂,可以有效减少编写、维护和观察高吞吐量并发应用程序的工作量。
222+
223+
虚拟线程在其他多线程语言中已经被证实是十分有用的,比如 Go 中的 Goroutine、Erlang 中的进程。
224+
225+
知乎有一个关于 Java 19 虚拟线程的讨论,感兴趣的可以去看看:<https://www.zhihu.com/question/536743167>
218226

219227
Java 虚拟线程的详细解读和原理可以看下面这两篇文章:
220228

@@ -223,6 +231,49 @@ Java 虚拟线程的详细解读和原理可以看下面这两篇文章:
223231

224232
虚拟线程在 Java 19 中进行了第一次预览,由[JEP 425](https://openjdk.org/jeps/425)提出。JDK 20 中是第二次预览,做了一些细微变化,这里就不细提了。
225233

234+
最后,我们来看一下四种创建虚拟线程的方法:
235+
236+
```java
237+
// 1、通过 Thread.ofVirtual() 创建
238+
Runnable fn = () -> {
239+
// your code here
240+
};
241+
242+
Thread thread = Thread.ofVirtual(fn)
243+
.start();
244+
245+
// 2、通过 Thread.startVirtualThread() 、创建
246+
Thread thread = Thread.startVirtualThread(() -> {
247+
// your code here
248+
});
249+
250+
// 3、通过 Executors.newVirtualThreadPerTaskExecutor() 创建
251+
var executorService = Executors.newVirtualThreadPerTaskExecutor();
252+
253+
executorService.submit(() -> {
254+
// your code here
255+
});
256+
257+
//
258+
class CustomThread implements Runnable {
259+
@Override
260+
public void run() {
261+
System.out.println("CustomThread run");
262+
}
263+
}
264+
265+
//4、通过 ThreadFactory 创建
266+
CustomThread customThread = new CustomThread();
267+
// 获取线程工厂类
268+
ThreadFactory factory = Thread.ofVirtual().factory();
269+
// 创建虚拟线程
270+
Thread thread = factory.newThread(customThread);
271+
// 启动线程
272+
thread.start();
273+
```
274+
275+
通过上述列举的 4 种创建虚拟线程的方式可以看出,官方为了降低虚拟线程的门槛,尽力复用原有的 `Thread` 线程类,这样可以平滑的过渡到虚拟线程的使用。
276+
226277
## JEP 437: 结构化并发(第二次孵化)
227278

228279
Java 19 引入了结构化并发,一种多线程编程方法,目的是为了通过结构化并发 API 来简化多线程编程,并不是为了取代`java.util.concurrent`,目前处于孵化器阶段。

docs/java/new-features/java21.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ JDK 21 共有 15 个新特性:
1818

1919
- [JEP 440:Record Patterns(记录模式)](https://openjdk.org/jeps/440)
2020

21+
- [JEP 444:Virtual Threads(虚拟线程)](https://openjdk.org/jeps/444)
22+
2123
## JEP 430:字符串模板(预览)
2224

2325
String Templates(字符串模板) 目前仍然是 JDK 21 中的一个预览功能。
@@ -142,6 +144,14 @@ java -XX:+UseZGC -XX:+ZGenerational ...
142144

143145
[Java 20 新特性概览](./java20.md)已经详细介绍过记录模式,这里就不重复了。
144146

147+
## JEP 444:虚拟线程
148+
149+
虚拟线程是一项重量级的更新,一定一定要重视!
150+
151+
虚拟线程在 Java 19 中进行了第一次预览,由[JEP 425](https://openjdk.org/jeps/425)提出。JDK 20 中是第二次预览。最终,虚拟线程在 JDK21 顺利转正。
152+
153+
[Java 20 新特性概览](./java20.md)已经详细介绍过虚拟线程,这里就不重复了。
154+
145155
## 参考
146156

147157
- Java 21 String Templates:<https://howtodoinjava.com/java/java-string-templates/>

0 commit comments

Comments
 (0)