Skip to content

Commit

Permalink
add java virtual thread
Browse files Browse the repository at this point in the history
  • Loading branch information
coldgust committed Oct 8, 2023
1 parent 907c1cf commit 37f5c0e
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 20 deletions.
20 changes: 0 additions & 20 deletions docs/posts/gitkeeper

This file was deleted.

42 changes: 42 additions & 0 deletions docs/posts/java- virtual-thread.md
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)

0 comments on commit 37f5c0e

Please sign in to comment.