https://docs.oracle.com/en/java/javase/20/docs/api/java.base/java/lang/Thread.html
Java的java.lang.Thread支持创建平台线程(Platform threads)和虚拟线程(Virtual threads)。
平台线程(Platform threads)
- 平台线程通常和内核线程是1:1的映射关系,被操作系统调度。
- 平台线程通常需要大的堆栈和其它被操作系统维护的资源。
- 平台线程可以执行所有类型的任务,但资源有限。
- 平台线程默认有一个自动产生的名字。
- 平台线程有守护(daemon )或者非守护(non-daemon)线程。
- 当Java虚拟机启动时,通常有一个非守护线程(通常称为应用的主线程)。
- 当所有非守护线程都停止的时候,开始关闭过程(shutdown sequence)。没有启动的非守护线程不会阻止关闭过程启动。
- 平台线程有一个线程优先级。
- 平台线程是线程组的成员。
- 平台线程在创建时继承守护状态(daemon status)、线程优先级、线程组(如果没有提供的话)。
- 创建平台线程时,捕获调用者上下文( caller context),来限制新创建的线程执行代码时的权限(当执行需要权限的动作时)。
虚拟线程(Virtual threads)
- 虚拟线程典型的是用户模式的线程,被Java运行时调度,而不是被操作系统调度。
- 虚拟线程通常需要更少的资源。一个Java虚拟机可以支持上百万的虚拟线程。
- 虚拟线程适用的场景是大多数情况下被阻塞,通常等待I/O的完成。虚拟线程不适用长时间占用CPU的密集操作。
- 虚拟线程一般用几个平台线程作为承载线程。
- 在虚拟线程中执行的代码对底层的承载线程不感知。
- 虚拟线程默认没有线程名字。
- 虚拟线程是守护线程,因此不会阻止关闭过程的开始。
- 虚拟线程有一个固定的线程优先级,且不能被改变。
- 创建一个虚拟线程不捕获调用者上下文( caller context)。因此,虚拟线程没有权限执行需要权限的动作。