Fork/Join 框架
Fork/Join 框架在 java.util.concurrent 包中定义 。 它包括几个支持并行编程的类和接口 。 它的主要作用是简化了多线程的创建过程、它们的使用 , 并使多处理器之间的进程分配机制自动化 。 使用该框架进行多线程和并行编程之间的显着区别与我们之前提到的非常相似 。 在这里 , 处理部分被优化为使用多个处理器 , 这与多线程不同 , 其中单个 CPU 的空闲时间在共享时间的基础上进行了优化 。 该框架的额外优势是在并行执行环境中使用多线程 。
这个框架中有四个核心类:
1、ForkJoinTask<V>:这是一个定义任务的抽象类 。 通常 , 任务是在此类中定义的 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 中的支持方式的简要描述 。 一个公认的事实是 , 拥有 N 个内核并不会让一切都快 N 倍 。 只有一部分 Java 应用程序有效地使用了这个特性 。 并行编程代码是一个困难的框架 。 此外 , 有效的并行程序必须考虑负载平衡、并行任务之间的通信等问题 , 有一些算法更适合并行执行 , 但很多不适合 。 无论如何 , Java API并不缺乏它的支持 , 我们可以随时修改 API 以找出最适合的 API 。
- javascript|最适合小白的拍照神器是谁?10款主流旗舰实拍对比,这两款太完美
- 伊隆·马斯克|电子商务在精准扶贫中的应用存在的问题
- Java|iPod售完即止,作为一代经典,值得再花1599元收藏吗?
- 无人机|大疆终于发布了一台我理想中的无人机!
- 数字时代变化中的经济秩序之四:企业角色变化规律
- Java|雷军出手了,1亿像素手机,8+256G已降至1349元
- javascript|从天鹅到家看58同城:一步步失去用户信任
- javascript|《下一个倒下的会不会是华为》,一本给老板看的书
- Java|热搜第一!超一半成年人体重超标,互联网巨头盯上了背后的生意
- Java|开卖四个月仍供不应求,12GB+512GB+66W,一天后开卖或将再度售空