问题标签 [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 投票
2 回答
2022 浏览

java - 为什么 fork join 任务在公共 fork join 池线程之外执行?

我的问题可以通过给出一个代码片段来最好地解释:

在我有 4 个内核的笔记本电脑上运行它时,会打印:

为什么某些任务跑在主线程中,主线程是普通fork join线程池之外的线程?

创建自定义分叉连接线程池时,不会发生这种情况:

那么,换句话说,普通池有什么特别之处呢?有了这些知识,在公共池中执行长时间运行的任务是明智的还是不明智的想法?

0 投票
0 回答
215 浏览

java - Forkjoin 框架每次运行时输出不同的值

我正在尝试使用 fork join 框架为填充有浮点数的一维数组实现中值滤波器。我已经设法按顺序执行此操作,并且我的并行版本正在输出值,只是每次运行它都会输出不同的值,例如,当打印出过滤数组的第一个元素时,我将得到 -0.178966 并在再次运行后我'将得到 -0.168073,依此类推。我认为这可能是某种竞赛条件,或者我在我的主要课程中忽略了某些事情或做错了什么。无论哪种方式,我希望你们中的一个人可以帮助我,我是并行编程的新手,还没有完全理解它,所以请多多包涵。谢谢你。(忽略主类中注释掉的代码)

我的主要课程和其他一些相关代码:

我的平行班:

0 投票
5 回答
10514 浏览

java - CompletableFuture 的完成处理程序在哪个线程中执行?

我对 CompletableFuture 方法有疑问:

问题是 JavaDoc 就是这样说的:

返回一个新的 CompletionStage,当此阶段正常完成时,将使用此阶段的结果作为所提供函数的参数来执行该阶段。有关异常完成的规则​​,请参阅 CompletionStage 文档。

线程呢?这将在哪个线程中执行?如果future是由一个线程池完成的呢?

0 投票
0 回答
114 浏览

java - 为什么我的快速排序工具因堆栈溢出而失败?

我需要编写一个算法来对超过 10、000、000 个元素的集合进行排序。所以我写了一个forkjoin快速排序......但是当输入变大时,代码崩溃了。首先,我使用的测试用例是一个随机列表,实现可以处理。然后,我只是尝试一些极端情况,就像一个有序的数字。代码失败。我检查了代码,但不知道为什么。

这是下面的代码:

测试用例失败:

对这个问题很困惑。谢谢你的回复。

0 投票
1 回答
63 浏览

java - ForkJoinFramework 只使用了两个工人

我有一个抓取大约六千个 url 的应用程序。为了最大限度地减少这项工作,我创建了一个 RecursiveTask,它消耗所有要抓取的 URL 的 ConcurrentLinkedQueue。它最多分成 50 个,如果 que 是空的,它会直接抓取它,但如果不是,它首先会创建一个自己的新实例并分叉它,然后它会抓取 50 的子集,然后它将加入分叉的任务。

现在我的问题来了,直到每个线程都工作了他的 50 个所有四个工作快速和同时工作。但是在两个停止工作并等待加入之后,只有另外两个正在工作并创建新的分叉和爬取页面。

为了可视化这一点,我计算了线程爬取 URL 的数量并让 JavaFX gui 显示它。

我错了什么,所以 ForkJoinFramewok 只使用了我的四个允许线程中的两个?我能做些什么来改变它?

这是我的任务计算方法:

这是我的图表的快照: 在此处输入图像描述

Ps 如果我允许多达 80 个线程,它将使用它们,直到每个有 50 个 URL 被抓取,然后只使用两个。

如果您有兴趣,这里是完整的源代码:https ://github.com/mediathekview/MServer/tree/feature/cleanup

0 投票
1 回答
83 浏览

java - 如果我们使用 ForkJoinPool 框架的 Recursiveaction,是否需要调用 join()?

如果我们使用 ForkJoinPool 框架的 RecursiveAction 是否需要调用 join() ?

例如:

或者

如果 left 和 right 都更新一个公共数据结构,是否有理由同时为 left 和 right 部分调用 join ?

提前致谢, 伯卡克

0 投票
2 回答
1032 浏览

java - 像往常一样使用 ForkJoinPool ExecutorService 有好处吗

假设我有这样的代码:

如果不是传入ThreadPoolExecutor我使用的构造函数,我可以获得更好的性能吗ForkJoinPool?如果是,那么为什么我应该更喜欢在任何情况下使用它而不是ThreadPoolExecutor.

更新 1

我的问题是关于ForkJoinPool通过ExecutorServiceAPI 的使用,并且不假设使用ForkJoinPool特定 API 进行递归任务拆分。

0 投票
1 回答
1468 浏览

java - 为什么Java工作窃取池(ForkJoinPool)不支持从线程池中预先创建的线程?

Executors.newWorkStealingPool()允许创建具有目标并行度的有限并发池。在幕后,它似乎创建了一个新的 ForkJoinPool ,其中定义了此处定义的默认工作创建工厂。

该工厂似乎会创建新线程,直到达到所需的并发性。为什么这个池不允许使用现有池中的线程子集来支持有限的并发性,同时仍然避免每次都创建新线程?我会假设在 Java 中创建线程是昂贵的。

相关:仅使用 ExecutorService 中的一部分线程

0 投票
1 回答
1882 浏览

java - 我如何知道 Fork 和 Join 在 Java 中是否有足够的池大小?

我正在尝试对一些大数据实施分而治之的解决方案。我使用 fork 和 join 将事物分解为线程。但是我有一个关于分叉机制的问题:如果我将分而治之的条件设置为:

如果没有足够的资源来调用subWorker(例如池中没有足够的线程)会发生什么?Fork/Join 框架是否为可用线程维护池大小?还是应该将此条件添加到我的分治逻辑中?

0 投票
0 回答
104 浏览

java - ForkJoinPool 实现的变化

我在 JDK 1.8.0_40 中使用 ForkJoinPool 时遇到了一个奇怪的问题,而只需恢复到 1.8.0 即可解决问题,而无需更改任何代码。

该代码采用一个可运行的列表,使用 ForkJoinTask.adapt() 将它们转换为 ForkJoinTask 列表。对于每个列表,我使用一个封闭的 ForkJoinTask,它在 exec() 方法的列表中调用 ForkJoinTask.invokeAll()。(https://github.com/mich8bsp/forkjoinpool-reproducer

我看到的问题是,偶尔调用这个 ForkJoinTask 会无限期地阻塞。我确实看到其他线程正在运行,但是称为“调用”的线程被卡住了。

对比 jdk 1.8.0 和 1.8.0_40 的源码我看到 ForkJoinPool.java 和 ForkJoinTask.java 有很多变化

是否有任何关于此更改的文档?任何导致可能导致问题的原因?

(我使用的 JVM 版本是 Java Hotspot 64-Bit Server VM build 25.40-b25)

编辑:也许这种变化是原因?https://bugs.java.com/view_bug.do?bug_id=8056248