Java运行时环境将少量的操作系统线程分配给大量的虚拟线程。与平台线程不同,虚拟线程通常具有平坦的调用堆栈,并且只执行单个 HTTP 客户端调用或 JDBC 查询。
图 2:虚拟线程
的线程局部变量,但您应该仔细考虑是否使用它们,因为单个 JVM 可以支持数百万个虚拟线程。
虚拟线程适合执行大部分时间被阻塞并经常等待 I/O 操作完成的任务。但是,它们不适用于长时间运行的 CPU 密集型操作。
虚拟线程不是更快的线程。它们运行代码的速度并不比平 制造电邮清单 台线程快。它们旨在提供可扩展性(更高的吞吐量),而不是速度(更低的延迟)。
JVM 管理操作系统线程池,并分配一个线程作为“载体线程”来执行虚拟线程的任务。当任务涉及阻塞操作时,可以暂停虚拟线程而不影响承载线程,从而允许其他虚拟线程并发运行。
使用传统方法可以实现虚拟线程之间的同步,并由 JVM 确保适当的协调。任务完成后,虚拟线程可以重新用于将来的任务。
当虚拟线程暂停时,JVM可以将其执行切换到另一个虚拟线程或载体线程,以提高效率。
摘要 – 这些是虚拟线程
综上所述,Java 的虚拟线程提供了轻量级且高效的并发性,由 JVM 通过操作系统线程的分配和资源的优化来管理。使用虚拟线程时需要记住一些最佳实践:
为每个任务启动一个新的虚拟线程。
虚拟线程不应该被池化。
大多数虚拟线程都有浅调用堆栈,因此寿命很短。
如何在标准 Java 中使用虚拟线程?
使用虚拟线程时,必须考虑以下几点:
虚拟线程无法访问其支持,并且 Thread.currentThread() 返回虚拟线程本身。
堆栈跟踪是独立的,并且虚拟线程中引发的每个异常仅包含其自己的堆栈帧。
虚拟线程的线程局部变量对其宿主不可用,反之亦然。
从代码的角度来看,载体及其虚拟线程之间共享平台线程是不可见的。
Thread 和 Thread.Builder API 提供了创建平台线程和虚拟线程的方法。