diff --git a/docs/posts/gitkeeper b/docs/posts/gitkeeper deleted file mode 100644 index 74c35ff..0000000 --- a/docs/posts/gitkeeper +++ /dev/null @@ -1,20 +0,0 @@ ---- -icon: pen-to-square -date: 2022-01-09 -category: - - 樱桃 -tag: - - 红 - - 小 - - 圆 ---- - -# 樱桃 - -## 标题 2 - -这里是内容。 - -### 标题 3 - -这里是内容。 \ No newline at end of file diff --git a/docs/posts/java- virtual-thread.md b/docs/posts/java- virtual-thread.md new file mode 100644 index 0000000..5d521ea --- /dev/null +++ b/docs/posts/java- virtual-thread.md @@ -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) \ No newline at end of file