Fork/Join 框架
Fork/Join 框架在 java.util.concurrent 包中定义。它包括几个支持并行编程的类和接口。它的主要作用是简化了多线程的创建过程、它们的使用,并使多处理器之间的进程分配机制自动化。使用该框架进行多线程和并行编程之间的显着区别与我们之前提到的非常相似。在这里,处理部分被优化为使用多个处理器,这与多线程不同,其中单个 CPU 的空闲时间在共享时间的基础上进行了优化。该框架的额外优势是在并行执行环境中使用多线程。
这个框架中有四个核心类:
1、ForkJoinTask:这是一个定义任务的抽象类。通常,任务是在此类中定义的 fork() 方法的帮助下创建的。这个任务几乎类似于使用 Thread 类创建的普通线程,但比它轻。它应用的机制是它可以在加入 ForkJoinPool 的少量实际线程的帮助下管理大量任务。fork() 方法可以异步执行调用任务。join() 方法允许等待,直到调用它的任务最终终止。还有另一种方法,称为invoke(),它将fork 和join 操作组合成一个调用。
2、ForkJoinPool:这个类提供了一个公共池来管理 ForkJoinTask 任务的执行。它基本上为非 ForkJoinTask 客户端的提交以及管理和监控操作提供了入口点。
3、RecursiveAction:这也是 ForkJoinTask 类的抽象扩展。通常,我们扩展此类以创建不返回结果或具有 void 返回类型的任务。此类中定义的 compute() 方法被覆盖以包含任务的计算代码。
4、RecursiveTask:这是 ForkJoinTask 类的另一个抽象扩展。我们扩展这个类来创建一个返回结果的任务。而且,与 ResursiveAction 类似,它还包括一个受保护的抽象 compute() 方法。此方法被覆盖以包括任务的计算部分。
Fork/Join 框架策略
该框架采用递归分治策略来实现并行处理。它基本上将一个任务分成更小的子任务;然后,将每个子任务进一步划分为子子任务。这个过程递归地应用于每个任务,直到它小到可以按顺序处理。假设我们要增加 N 个数字的数组的值。这就是任务。现在,我们可以将数组一分为二,创建两个子任务。将它们中的每一个再次划分为另外两个子任务,依此类推。通过这种方式,我们可以递归地应用分而治之的策略,直到将任务挑出到一个单元问题中。然后,这个单元问题可以由可用的多核处理器并行执行。在非并行环境中,我们要做的就是循环遍历整个数组,依次进行处理。鉴于并行处理,这显然是一种低效的方法。但是,真正的问题是每一个问题都可以分而治之吗?绝对不!但是,有些问题通常涉及某种特别适合这种方法的数据数组、集合和分组。顺便说一句,有些问题可能不使用数据收集,但可以优化以使用并行编程策略。
Java入门推荐: www.bilibili.com/video/BV1qL…