当前位置: 首页 > 知识库问答 >
问题:

Java Fork/Join与多核世界中的多线程

祁默
2023-03-14

无法理解为什么Fork-Join在多核利用方面更好。

举例说明(仅为理论):

我有一个Web服务endpoint数组:[E1、E2、E3、E4]

假设每个endpoint都返回一个数字。

然后我必须总结总数并返回结果。

记住这个简单的故事。

我有两个选择:

  1. ExecutorService修复了4个线程池,并并行跨越这4个调用

假设我有4个核。

有了Executor service,就可以创建4个JVM线程,而且完全由操作系统在同一个核心或多个核心上调度它们。

如果它们安排在同一个核心上,那么我们就存在核心利用不足的问题。

如果他们被安排在不同的核心上,那么我们笑了!

我想知道的是,在使用多核时会出现一些不确定性。

Fork Join是如何解决这个问题的?它是否会在内部向操作系统传递某种神奇的指令以使用多核?

如果我上面的例子与Fork-Join和Executors之间的比较无关,那么Fork-Join如何声称它比传统的多线程更有效地利用内核呢。

共有2个答案

潘志国
2023-03-14

Fork/join是更高级别的抽象。通常,如果您使用更高级别的库来解决问题,那么您将使用更少的新代码行来解决问题。这总是一件好事。

不过,高级通常意味着更专业。分叉/连接可能适合也可能不适合你的问题。如果它不合适,那么你可能会浪费很多精力,试图让它合适会弄得一团糟。

如果它确实合适,而你不使用它,那么很可能你会重新发明一些轮子。这从来不是一件好事。

费学
2023-03-14

只有当任务可以递归地细分为较小的任务时,Fork/Join才比简单的ExecutorSavice更快。在这种情况下,Fork/Join可以使用工作窃取来确保所有CPU都得到最佳使用。

在你的情况下,它并没有更快。

编辑:除了窃取工作外,任务的调度也可以更快。正如维基百科所说:

分叉连接编程中使用的轻量级线程通常会有自己的调度程序(通常是窃取工作的调度程序),将它们映射到底层线程池。这个调度程序可能比功能齐全的抢占式操作系统调度程序简单得多:通用线程调度程序必须处理锁的阻塞,但在分叉连接范式中,线程仅在连接点阻塞。

 类似资料:
  • 但是java7中的多核和fork/join框架是这样吗?我的意思是,我听说有了多个核心,我们实际上可以实现并行。因此,如果我有两个线程运行,两个核心cpu,每个线程被赋予一个单独的核心(但这并不保证),那么它们实际上是并行的吗,因为jvm调度程序仍然会导致时间交织? 我很抱歉,如果这个问题是愚蠢的,但我真的不确定这一点。请帮助我理解!! 谢了!欧尼

  • 问题内容: 我希望能够使用gnu octave编程多个线程,以便它将利用多个处理器。 我在Fedora 17 Linux上安装了GNU Octave,并执行了以下操作: 在我的计算机上安装了最新版本的octave 3.6.2。它的效果很好,但是当您将两个巨大的矩阵相乘时,它会使八度使用的一个CPU陷入瘫痪。如果矩阵乘法利用所有内核,那就太好了,因为在这种情况下,CPU显然是瓶颈。 倍频程能否充分利

  • 问题内容: 我发现在Python 3.4中,用于多处理/线程的库很少:多处理vs线程与asyncio。 但是我不知道使用哪个,或者是“推荐的”。他们做的是同一件事还是不同?如果是这样,则将哪一个用于什么?我想编写一个在计算机上使用多核的程序。但是我不知道我应该学习哪个图书馆。 问题答案: 它们旨在(略有)不同的目的和/或要求。CPython(典型的主线Python实现)仍然具有全局解释器锁,因此多

  • 问题内容: 抱歉,简约标题很简短,但我不知道该如何形容。我有三个表: 组表 多对多表 和元素表 一切都很好,非常简单。我试图实现的SELECT如下 我想从表Elements中选择 所有 元素,并将体裁字段设置为 Drama 或 null 。 我正在尝试在 MySQL中 执行此操作。 先感谢您 问题答案: 这个小技巧是可能的(多对多表上的外部联接,约束是GroupID必须为3(对于Drama) ht

  • 本文向大家介绍C#多线程与跨线程访问界面控件的方法,包括了C#多线程与跨线程访问界面控件的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C#多线程与跨线程访问界面控件的方法。分享给大家供大家参考。具体分析如下: 在编写WinForm访问WebService时,常会遇到因为网络延迟造成界面卡死的现象。启用新线程去访问WebService是一个可行的方法。 典型的,有下面的启动新线程示例

  • 问题内容: 我有以下查询,该查询适用于MySQL: 但是它不适用于MS Access。我尝试在周围添加括号,但是它在FROM子句中给了我语法错误。因此,该查询应如何显示才能在MS Access中工作? 问题答案: 访问权限删除要求加星号(*): 此外,必须使用括号将联接嵌套: 这特定于Access(Jet)SQL。