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

配置分叉连接线程池

梁磊
2023-03-14
  executor = "fork-join-executor"
  # Configuration for the fork join pool
  fork-join-executor {
    # Min number of threads to cap factor-based parallelism number to
    parallelism-min = 24
    # Parallelism (threads) ... ceil(available processors * factor)
    parallelism-factor = 4.0
    # Max number of threads to cap factor-based parallelism number to
    parallelism-max = 48
  }

我不确定的是,在这种情况下,会创建多少个线程?我在一台2核心的机器上运行,所以每核心24个线程,最多48个线程

当并行度因子设置为4.0时,可以并行运行的线程数将是8。那么,设置最小值和最大值(我的例子是24和48)的需要是什么?

共有1个答案

柯树
2023-03-14

让我们从解释forkjoinpool中的并行性是如何工作的开始。线程数由单个(构造函数)参数parallelism(默认为内核数)控制。forkjoinpool尽量保持并行运行线程。但它可以决定生成更多的线程,如果其中一些线程被阻塞。例如。如果有太多分叉任务等待连接,除非添加新线程,否则计算将被阻塞;等待线程是活动的,但没有运行(因为它们在等待)。这里有更多解释。

问题中的dispatcher配置控制parallelism参数将设置为什么值。它被设置为可用处理器*Parallelism-Factor,但至少Parallelism-min,最多Parallelism-max。请参阅此处和此处的更多信息。

在这种情况下会创建多少个线程?

 类似资料:
  • 我正在用Java 8编写一个命令行应用程序。有一部分涉及一些计算,我相信使用多个线程并行运行可能会带来好处。然而,我在编写多线程应用程序方面没有太多经验,因此我希望您能引导我朝着正确的方向前进,我应该如何设计代码的并行部分。 为了简单起见,让我们假设所讨论的方法接收到一个相对较大的长数组,它应该返回一个只包含素数的集: 现在,我想重构方法,使其由四个线程并行执行,当所有线程都完成时,返回结果。在我

  • 问题内容: 我以前在应用程序中使用过线程,并且对线程的概念非常了解,但是最近在我的操作系统讲座中,我遇到了fork()。这类似于线程。 我用谷歌搜索了它们之间的区别,我知道: Fork只是一个看起来与旧流程或父流程完全相似的新流程,但它仍然是具有不同流程ID并拥有自己内存的不同流程。 线程是轻量级进程,具有较少的开销 但是,我仍然有一些疑问。 什么时候应该更喜欢fork()而不是线程? 如果我想以

  • 情况是应用程序不时地无限挂起。 执行代码的线程在上冻结: 可以假设传递给的任务执行时间过长。 但令人惊讶的是,线程转储中没有出现,因此看起来池没有执行任何计算!

  • 我一直在研究JDK 7中的新特性,即Fork和Join。在Javadoc中,它指出,在中,不能仅在的上下文中执行fork。但是它没有提到方法调用是否创建了一个新线程。 使用工作窃取算法来平衡线程之间的工作,但没有提到实际创建了多少线程。 我有一个任务,我应该以某种方式分解它,但我担心会创建太多线程,并且会因为管理这些线程的开销而降低执行性能。 有人能帮我吗?

  • detachedException:无法执行查询。未配置连接org.jooq.impl.abstractquery.execute(abstractquery.java:316)org.jooq.impl.abstractresultquery.fetchlazy(abstractresultquery.java:365)org.jooq.impl.abstractresultquery.fetc

  • 这是今天回答另一个问题的“副作用”。这更多的是好奇心而不是实际问题。 JavaSE7提供了Oracle所称的“fork/join框架”。这可能是将工作安排到多个处理器的一种更好的方法。虽然我理解它应该如何工作,但我无法理解它的优势所在,以及关于偷工作的说法。 也许其他人更了解为什么这种方法是可取的(而不是因为它有一个奇特的名字)。 分支/连接的底层原语是s,即s,其想法是要么立即执行工作[原文如此