Java Fibers

10 Sept 2024 | 4 分钟阅读

在本文中,我们将探讨 Java Fibers 是什么,以及它们在 Java 编程语言中的使用场景。

什么是 Java Fibers?

在编程语境中,Java Fibers 也被称为 Java 虚拟机 (JVM) Fibers。JVM Fibers 是可以在用户模式下应用的用户模式线程。在 Java 中运行的每一行代码都以线程的形式运行。Java Fibers 和 Java Threads 的抽象和应用是相同的。Java Fibers 和 Java Threads 之间唯一的区别是,Threads 需要大量的 RAM,并且启动和同步速度较慢。但 Java Fibers 完全特定于运行时。Java Fibers 非常轻量级,并且在没有虚拟开销的情况下进行同步。Java Fiber 由两个组件构成:调度器续体

什么是调度器?

Java 中的调度器用于在特定时间点或在某些固定时间间隔调度任务执行。在 Java 编程语言中有多种使用调度器的方式,如下所示:

  1. Java 库 java.util.TimerTask
  2. 使用 Quartz Scheduler。
  3. util.concurrent.ScheduledExecutorService
  4. springframework.scheduling.TaskScheduler

什么是续体?

Java 中的续体是一个不可变对象,它捕获 Java 栈中的所有内容。Java 中的续体对象用于稍后恢复捕获的执行状态。捕获 Java 栈中所有内容的续体对象包括:

  1. 当前指令指针。
  2. 返回地址。
  3. 局部变量。

Quasar Fiber

Quasar Fiber 是一个 Java Fiber,它在 Java 编程语言中类似于线程。Quasar Fiber 在 Java 中实现了线程 API。Quasar 将 Java 编程语言中的线程和 Quasar Fiber 的实现抽象为一个“链”或简称为“粗绳”。这使得 Fibers 和 Threads 能够方便地进行协作,而不会受到任何干扰。让我们考虑这样一个场景:一个 Java 应用程序在主线程中启动。如果我们希望在某个点使用 Fiber 而不是线程,我们可以在运行时在该特定点生成 Fiber,并将其连接到该点的线程。我们还可以利用与 Java 中的链通用的方法,因为我们可以将链用作 Fibers 或线程。事实上,Quasar Fiber 还包括一个基于链的 Java 编程语言“java.util.concurrent”的端口,并支持 Fiber。Quasar 的实现方法几乎与内核在 OS 线程上使用的实现方法相似。在 Quasar 方法中,我们通常将 Java Fiber 的整个堆栈冻结到其基本运行方法,然后该方法可以在常用的 Java 执行器上重新调度。换句话说,这种实现也称为 Fiber 挂起。

使用 Quasar Fibers 的必要性

操作系统线程提供了我们所需的一切,但性能代价巨大。对于 Fibers 而言,它们在应用程序层进行调度,并且可以使用适合其用例的更好的调度器。大多数 Fibers 的主要目的是服务事务。因此,它们只活动很短的时间,并且经常被阻塞。Fiber 通常由另一个 Fiber 唤醒,因为它们只运行很短的时间,并且它们将控制权转移给另一个被唤醒的 Fiber。两个 Fiber 之间的控制转移是通过同步机制(如队列)完成的。在 Quasar Fibers 中切换 Fiber 时,缓存丢失最少,因为它使用了“工作窃取”算法。

Java Fibers 是生成器还是异步/等待?

正如我们所讨论的,Java Fibers 实际上是由续体对象和调度器组成的线程。生成器和异步/等待都是使用续体或无栈实现的,它们只能捕获单个栈帧。但是这些续体没有与之关联的调度器。因此,这些生成器和异步/等待不是线程。因此,它们不能是 Java Fibers。

结论

在本文中,我们学习了 Java Fibers 以及它们的使用原因,以及 Java 编程语言中的线程。我们还讨论了实现 Java Fibers 的主要过程之一,即 Quasar Fibers。


下一个主题Java MD5 哈希示例