问题标签 [forkjoinpool]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
662 浏览

java - ForkJoinPool 中的饥饿与托管阻塞

在我的应用程序中,我以不同的速率向 commonPool 提交两种任务。

任务1:

任务2:

在某些场景下,当task-1类型的任务提交到池中的速率太高,blockingQueue 已满时,所有运行task-1类型任务的线程都在 put 上阻塞(线程数大约是 52)。但是仍在提交到池中的task-1task-2类型的新任务不会导致池中产生新的工作人员,这会导致所有后续任务在工作队列中排队,从而导致饥饿和死锁导致应用程序冻结。

有人可以帮我理解我在这里做错了什么吗?

经过一番挖掘,我发现了这些:

但看起来这个错误已在 java 7 本身中修复。

环境:

  • JDK:oracle-j2sdk1.8 | 1.8.0+更新20
  • 拱门:amd64
  • 操作系统:Debian Wheezy

常用池配置:

  • 可用处理器 = 2
  • 这意味着并行度 = 1
  • 所有其他配置都是默认的

更新 1

更多信息:

submit将 runnables 设置为ForkJoinPoolwhich 内部调用externalPush方法:

当我进行远程调试时,执行达到

但是n非常大,不小于或等于1,因此signalWork不会调用内部调用方法的tryAddWorker方法。

0 投票
1 回答
604 浏览

groovy - GParsPool.withPool 和 GParsPool.withExistingPool 有什么区别?

GParsPool.withPool 和 GParsPool.withExistingPool 有什么区别?我不明白文档中的解释。

0 投票
0 回答
359 浏览

java - ForkJoinPool 线程产生新线程

假设我必须并行运行一些(大部分是独立的)昂贵的任务。通常,这可以使用 fork/join 框架轻松完成。

我的问题是,其中一些任务也可能产生子任务,使用不同的 ForkJoinPool (在调用层次结构更深的某些方法中)。我知道这会产生许多线程,这可能会减慢我的应用程序,我想避免这种情况。一种解决方案是使用全局池并在那里添加任务,但这不是我的选择。

这对我有用的原因是一些原始任务是依赖的并且可能相互等待。例如,假设 A1 和 A2 是两个任务,需要 B 的结果(可并行化)才能分别进行到 C1 和 C2。在这种情况下,运行 A1 和 A2 的线程可以专注于 B 以提高 CPU 利用率。一个简单的例子如下所示。

是否可以在这些任务中使用“父”池?在上面的示例中,父池是 main 方法中的一个。自然地,我不想通过一长串方法调用或使用全局变量将其作为参数传递。理想情况下,我想将我的程序限制为父池使用的线程数,而不做任何此类技巧。

0 投票
1 回答
1362 浏览

java - 当 fork-join 有工作要做时没有工作线程?

我有一个错误,现在在生产中出现了两次,我的一个 fork/join 池停止工作,即使它有工作要做并且正在添加更多工作。

这是我到目前为止得出的结论,以解释为什么要执行的任务队列正在填满并且任务结果的流程正在停止。我有线程转储,我的任务生产者线程正在等待 fork/join 提交完成,但是没有 ForkJoinPool 工作线程对此做任何事情。

不管我在做什么,这都不应该发生,对吧?线程转储是在检测到初始条件数小时后开始的。我在运行时还有另外两个 ForkJoinPools 都在正常运行,并且存在许多工作线程。

该池的并行度为 1(我知道这很愚蠢,但不应破坏 fork/join 池的正确性)。在我的任务队列填满并且线程转储显示没有工作人员之前,没有检测到其他错误或异常。

有没有其他人看过这个?要么我遗漏了某些东西,要么 fork/join 中存在一个从未(重新)为我启动工作线程的错误。

运行时是 java 8

用代码更新

这是对我们如何在生产中使用 fork/join 的合理简化。我们有三个引擎,其中只有一个配置了并行度为 1。

0 投票
0 回答
302 浏览

java - Stream API 中的 Fork/Join 框架实现

Oracle 官方文档说:

java.util.streams 包中的方法使用了 fork/join 框架的另一种实现

我发现的唯一公共类是AbstractTaskAbstractShortCircuitTask,它是抽象的。

而且我还没有找到 ForkJoinPool 的实现。

问题:这是否意味着我们没有任何手动访问 Stream API 中的 fork/join 过程并且不能直接使用此实现?

0 投票
1 回答
149 浏览

java - ForkJoinPool BufferedImage 处理方式

我正在尝试使用Java中的ForkJoinPool处理图像。我使用流对图像进行了一些自定义操作。我正在尝试将ForkJoinPool用于getRGBsetRGB方法。如何实现getRGB方法的并行性?

getRealRGB方法的唯一代理BufferedImage。我知道这可能不切实际,但我只想知道如何在这种情况下使用ForkJoinPool 。是的,上面的代码正在抛出ArrayIndexOutOfBound异常。请就如何拆分工作负载(行与列与小网格。现在,我正在按行拆分)以及如何确定阈值提出建议。

0 投票
1 回答
1446 浏览

java - awaitQuiescence 超时后不返回

我正在尝试使用 ForkJoinPool 中的 awaitQuiescence 方法等待所有提交的任务完成,或者如果超时后任务尚未完成,则返回 false。

实际上所有提交的任务都可以向池中添加额外的任务,所以我不能使用 awaitTermination 方法,因为这会阻止提交这些额外的任务。但是,awaitQuiescence 不会返回任何内容,即使指定的时间已经结束。

我试图在下面的代码中明确这个问题。CountDownLatch.await 永远不会被触发,但是为什么 awaitQuiescence 方法不返回 false 呢?

非常感谢!

0 投票
2 回答
791 浏览

java - Java中的并行数独求解器

我有一个作业需要在 Java 中实现数独求解器的顺序和并行版本(使用 ForkJoin 框架进行并行)。

我写了顺序的,它工作正常。算法思想是一个简单的回溯练习:对于每个尚未填充的单元格(从表格的左上角开始),用所有合法候选者(从 1 到 9 的整数)填充(按顺序,一次一个) ) 直到到达矩阵的末尾(第 9 行第 9 行)。如果您已到达终点,则增加解决方案编号。

我想实现并行版本,只是为为特定单元格找到的每个有效候选者生成一个新线程,然后等待它们。它似乎不起作用,我无法找到原因。

我发布了应该完成整个工作的课程,希望能找到一个好的建议:

0 投票
3 回答
12468 浏览

multithreading - Java8 ForkJoinPool 和 Executors.newWorkStealingPool 的详细区别?

使用之间的低级区别是什么:

其中X是所需的并行级别,即正在运行的线程。

根据文档,我发现它们相似。还告诉我在任何正常使用下哪个更合适和安全。我有1.3亿个条目要写入 BufferedWriter 并使用 Unix 按第一列排序对它们进行排序。

如果可能的话,还让我知道要保留多少线程。

注意:我的系统有8个核心处理器和32 GB RAM。

0 投票
2 回答
466 浏览

java - Fork/Join Sudoku Solver

I've a problem with an exercise. I need to find all the solutions for a given sudoku, using fork/join parallelism. I made an algorithm but it seems it doesn't work. It stops at some point and I can't figure it out why.

Here's the code:

And the code for the object Cella:

My idea is to give to each thread the faculty to solve its own sudoku, given the "legal values" of the candidate cell. I then collect all threads in an ArrayList and ask them to fork with the last for. Every thread should return an Integer (0 for no success, 1 for success) in order to count how many possible sudokus can be solved.

However, the algorithm only covers 1/3 of the sudoku: after a certain point, it stops filling the cells and it just returns without completing it.

Can someone suggest me where I'm doing mistake(s) ?