Fork Join in Java2025年5月7日 | 阅读6分钟 如今,系统都使用多核处理器。多核处理器可以加快计算速度。因此,程序员有必要有效地利用多核处理器,以便在更短的时间内生成结果。Java 中的 Fork/Join 用于有效地利用核心(处理指令的 CPU 大脑)。Fork/Join 将较大的任务分解成较小的子任务。然后将这些子任务分配给各个核心。随后将这些子任务的结果合并以生成最终结果。任务的分解和结果的合并模仿了分而治之算法。Fork 负责分解任务,Join 负责合并任务结果以生成最终结果。 ![]() 值得注意的是,负责完成子任务的各种线程从不空闲。实际上,它们实现了工作窃取算法,在这种算法中,空闲线程会从忙碌的线程那里窃取工作。 伪代码需要记住的一个重要观点是,不应该盲目地将问题分解成子问题。将问题分解成子问题是有开销的。如果开销和解决子问题所需的时间大于解决问题本身所需的时间,那么就不应该分解问题。逻辑上可以合理地将问题分解为子问题的界限称为阈值。 Java Fork/Join 程序以下程序演示了 Java 中 fork/join 的工作原理。 文件名: ForkJoinExample.java 输出 The number 50 is found 5 times. 说明:在代码中,我们扩展了抽象类 RecursiveTask。该类的 compute() 方法包含计算代码。RecursiveTask 类的类型参数 <Integer> 决定了返回结果的类型。使用 Recursive 类创建的搜索任务被提交到 ForkJoinPool。当调用 ForkJoinPool 类的 invoke() 方法时,任务执行开始。invoke() 方法在单次调用中组合了 fork() 和 join() 方法,并等待任务执行完成,然后返回结果。当调用 invoke() 方法时,它会将任务分解成子任务。 Java ForkJoinPool 类fork/join 框架的核心是 ForkJoinPool 类。ForkJoinPool 类实现了 ExecutorService 接口。它还扩展了 AbstractExecutorService 类并实现了工作窃取算法。 ForkJoinPool 类的方法
Fork/Join 实现有两种方法可以实例化 ForkJoinClass。 1) 使用类的构造函数ForkJoinPool():它是 ForkJoinPool 类的默认构造函数。它创建一个默认池。生成的池支持的并行度等于系统中可用的处理器总数。在上面的示例中,我们使用此构造函数实例化了 ForkJoinPool 类。 ForkJoinPool(int p):这是一个参数化构造函数,也用于创建具有自定义并行度的池。值 p 必须是自然数(> 0),并且不应超过系统中可用的处理器数量。 2) 使用静态方法 commonPool()ForkJoinPool 类的静态方法 commonPool() 也可用于创建 ForkJoinPool 类的实例。 文件名: JavaForkJoinPoolExample.java 输出 Total Number of available cores in the system processor is: 4 Total number of active threads before invoking: 0 Total number of active threads after invoking: 3 The size of the Common Pool is: 3 |
软件开发需要日志记录,这对于调试和故障排除也至关重要。Java 中的 Logger 类是日志记录数据的关键工具,并在许多应用程序中得到广泛使用。Java 标准库包含 Logger 类,它提供了一种简单灵活的机制...
阅读 4 分钟
合并两个已排序的链表是学习算法时必须解决的基本问题之一。这是一个将两个已排序列表合并的过程,合并后,结果列表仍然保持已排序状态。这个问题通常作为一项编码挑战出现...
5 分钟阅读
在 Java 中,递增和递减运算符是一元运算符。它们分别用于将变量的值增加或减少 1。递增运算符由一对加号(++)表示,递减运算符由...
阅读 6 分钟
Java 编程语言使用的接口是 Java 命名和目录接口 (JNDI)。它是一个 API(应用程序编程接口),用于与服务器通信并使用命名约定从数据库获取文件。一个词或一个短语都可以...
阅读 6 分钟
在名为 Str 的字符串列表中查找最大的字符串。具有最多不同字符的字符串就是最大的字符串。示例 1:输入:字符串 str[] = {"AN KOW", "LO JO", "ZEW DO RO"} 输出:最多唯一字符的字符串是 "ZEW DO RO"。解释:"AN KOW" 具有唯一字符...
阅读9分钟
Java ConcurrentSkipListSet 类实现了 Collection 接口和 AbstractSet 类,作为 Java Collection Framework 的一部分。它提供了 Java 中 NavigableSet 的并发、可扩展版本。ConcurrentSkipListSet 在其实现中基于 ConcurrentSkipListMap。取决于是否使用构造函数,条目...
阅读 16 分钟
比较两个二叉树的结构和节点值以检查它们是否为镜像。一个二叉树是另一个的镜像,如果一个的左子树与另一个的右子树匹配,反之亦然。这涉及递归来遍历和...
阅读9分钟
在 LTS 版本 11 之后的版本。JDK 12 是 6 个月发布周期的一部分。于 2019 年 3 月 19 日发布,它是一个非 LTS 版本,不提供长期支持。SE 平台的开源参考实现是...
5 分钟阅读
在不同严峻的环境中编码时,许多人可能都遇到过 NZEC 错误。NZEC(非零退出码)顾名思义,当您的代码未能返回 0 时发生。当代码返回 0 时,表示它已成功执行。任何其他...
5 分钟阅读
在本节中,我们将学习什么是前导数,并创建 Java 程序来检查给定的数字是否是前导数。前导数程序经常在 Java 编码测试和学术界中出现。前导数 在给定的数字中,如果...
阅读 3 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India