-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
42 additions
and
20 deletions.
There are no files selected for viewing
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,42 @@ | ||
# Java 虚拟线程(virtual thread) | ||
|
||
虚拟线程是轻量级线程,可以减少编写、维护和调试高吞吐量并发应用程序的工作量。虚拟线程在 | ||
`JDK 19`中作为预览特性引入,在`JDK 21`中作为正式特性引入。 | ||
|
||
在其它语言中也有类似于虚拟线程的技术,例如`Go`中的`goroutine`。 | ||
|
||
关于虚拟线程的背景信息可以参考:[JEP 444](https://openjdk.org/jeps/444)。 | ||
|
||
线程是最小的可调度单元,多个线程可以并发运行,在很大程度上,它们之间是独立运行的。 | ||
线程是`java.lang.Thread`的一个实例。线程分为两种类型:平台线程(platform thread)和虚拟线程(virtual thread)。 | ||
|
||
## 什么是平台线程(platform thread) | ||
|
||
平台线程是对操作系统线程的包装实现。平台线程在其底层操作系统线程上运行Java代码,在其生命周期内都与一个操作系统线程绑定。 | ||
因此,可用的平台线程数量受限于操作系统线程的数量。 | ||
|
||
平台线程通常有一个大的线程堆栈和其他由操作系统维护的资源。它们适合运行所有类型的任务, | ||
但其可用的资源受限于操作系统的线程数量。 | ||
|
||
## 什么是虚拟线程(virtual thread) | ||
|
||
与平台线程一样,虚拟线程也是`java.lang.Thread`的一个实例。然而,虚拟线程并不绑定到特定的操作系统线程。 | ||
虚拟线程仍然在操作系统线程上运行代码,但是,当运行在虚拟线程中的代码调用阻塞I/O(blocking I/O)时, | ||
Java runtime会挂起该虚拟线程,直到它可以被恢复。与挂起的虚拟线程相关联的操作系统线程,可以为其它虚拟线程执行操作。 | ||
|
||
虚拟线程与虚拟内存的实现有点类似,为了模拟大量内存,操作系统将一个大的虚拟地址空间映射到数量有限的RAM。类似地, | ||
为了模拟大量线程,Java运行时将大量虚拟线程映射到少量操作系统线程。 | ||
|
||
与平台线程不同,虚拟线程的调用栈通常更浅,例如只执行一个HTTP调用或者一次JDBC查询。 | ||
尽管虚拟线程支持线程局部变量(thread-local variables)和可继承的线程局部变量(inheritable thread-local variables), | ||
但您应该仔细考虑使用它们,因为单个JVM可能支持数百万个虚拟线程。 | ||
|
||
虚拟线程适合运行大部分时间被阻塞的任务,这些任务通常等待I/O操作完成。 | ||
然而,**它们并不适用于长时间运行的cpu密集型操作**。 | ||
|
||
|
||
未完待续... | ||
|
||
## Reference | ||
|
||
1. [Virtual Threads](https://docs.oracle.com/en/java/javase/21/core/virtual-threads.html) |