Java 中 Fork/Join 框架和 ExecutorService 的区别

2025年3月17日 | 阅读 7 分钟

在 Java 中,**Fork/Join** 框架主要用于提供与并行处理和编程相关的功能,它通过将一个操作分解为更小的操作或指令,并利用可用的 CPU 核心进行处理来实现。

类似地,Java 中的 **ExecutorService** 可以定义为一个接口,负责提供用于管理和控制线程的替代方案。**java.util.concurrent** 包负责存储 Java 中的 **ExecutorService** 接口。**java.util.concurrent** 包在 Java 5 中发布。

Java 中的 Fork/Join 框架

Java 的 Fork/Join 框架主要用于提供与执行任务框架相关的特性和功能,以获得最佳性能。并行计算引擎主要用于许多高级框架。Fork/Join 框架支持并行编程,这在用分而治之技术解决问题时非常有用。问题可以使用分而治之技术以以下方式解决:

  1. 一个任务将被分解或拆分成多个子任务。
  2. 所有子任务将并行解决。
    1. 可以使用多个核心以并行方式运行各个子任务。
    2. 单个核心可以并发地在不同线程中运行或执行多个子任务。
  3. 等待状态,直到所有子任务完全执行完毕。
  4. 生成的结果将被合并或分组在一起。

让我们通过一个 Java 示例程序来详细了解 Java 中 Fork/Join 框架的特性和功能。

文件名: ForkAndJoin.java

输出

Difference Between Fork/Join Framework and ExecutorService in Java

Java 中的 ExecutorService

在 Java 中,ExecutorService 主要用于管理和控制所有异步任务的顺序和执行,这些任务有时被称为 Runnable 和 Callable 接口的实例。任务可以提交到 **ExecutorService**,而无需直接处理线程。提交给 ExecutorService 的任务将由它负责线程管理。

让我们通过一个 Java 示例程序来详细了解 Java 中的 ExecutorService。

文件名: ExecutorServiceExample.java

输出

Difference Between Fork/Join Framework and ExecutorService in Java

让我们通过另一个示例程序来了解 Java 中 Fork/Join 框架和 ExecutorService 的特性和功能。

示例 2

文件名: ForkJoinExecutorService.java

输出

Result Obtained By Fork/Join Framework: 120
Result Obtained By ExecutorService:  120

Java 中 Fork/Join 与 ExecutorService 的区别

让我们通过一个表格来了解 Java 中 Fork/Join 框架与 ExecutorService 的主要区别。

Fork/Join 框架ExecutorService
Java 7 中的 Fork/Join 框架可以定义为一个实现,它遵循分而治之的算法。分支的 ForkJoinTasks 通过一个中央 ForkJoinPool 来执行。在 Java 中,ExecutorService 可以定义为一个执行器,负责提供用于管理、跟踪进度和停止异步任务的方法和函数。
Fork/Join 框架利用或实现了工作窃取算法。当一个进程或任务依赖于使用 join 操作创建的其他子任务的完成时,当前执行任务的工作线程将查找尚未执行的其他任务,并借用它们来执行。而在 ExecutorService 中,当一个进程或任务在等待使用 join 操作创建的另一个子任务完成执行时,负责执行该线程的线程不会借用其他待处理任务来执行。
在 Java 中,Fork/Join 框架主要用于解决与递归相关的问题,以及在需要子任务运行子任务然后处理其结果的情况下。与 Fork/Join 框架不同,Java 中的 ExecutorService 不能用来解决与递归相关的问题。因为这会导致线程被占用并等待其他线程的结果。
换句话说,Java 中的 Fork/Join 框架是通过 Java 中的 ExecutorService 实现的。唯一的主要区别可以解释为 Fork/Join 框架的实现负责创建一个 DEQUE 工作池。可以使用 ExecutorService 创建所需数量的线程。类似地,应用了一个阻塞队列,用于存储所有处于等待状态的剩余任务。