问题标签 [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.
java - 如何配置单线程的 ForkJoinPool?
是否可以配置ForkJoinPool
为使用 1 个执行线程?
我正在执行Random
在ForkJoinPool
. 每次运行时,我都会得到不同的运行时行为,这使得研究回归变得困难。
我希望代码库提供“调试”和“发布”模式。“调试”模式将配置Random
固定种子和ForkJoinPool
单个执行线程。“发布”模式将使用系统提供的Random
种子并使用默认ForkJoinPool
线程数。
我尝试ForkJoinPool
使用 1 的并行度进行配置,但它使用 2 个线程(main
和第二个工作线程)。有任何想法吗?
java - ForkJoinPool.invoke() 和 ForkJoinTask.invoke() 或 compute()
我正在阅读 Java ForkJoin 框架。不直接调用(例如)invoke()
的实现,而是实例化和调用,有什么额外的好处?当我们调用这 2 个方法时,到底会发生什么?ForkJoinTask
RecursiveTask
ForkJoinPool
pool.invoke(task)
invoke
从源头上看,如果recursiveTask.invoke
被调用,它会以托管线程池的方式调用它的exec
and 最终compute
。因此,为什么我们有成语更加令人困惑pool.invoke(task)
。
我写了一些简单的代码来测试性能差异,但我没有看到任何东西。也许测试代码是错误的?见下文:
java - Java7 ForkJoinTask 中哪个阈值会更好
我正在尝试 Java ForkJoin 框架并编写了一个程序来处理大型数据列表。
众所周知,ForkJoinTask 中总是设置字段阈值来指出数据列表分区的最小数目。
问题是,阈值的大小将获得更好的性能,还是灵活且仅与 CPU 或线程支持的核心数相关?
在 Forkjointask 等并行计算框架中是否有阈值的最佳实践?
java - Java:如何让已完成的线程从正在运行的线程中获取任务
我正在开发一个具有不同运行时间的任务的多线程应用程序。当一个线程完成时,有没有办法让它从仍在运行的线程中接管一些任务?
这是一个例子。我用 5 个线程启动我的程序,每个线程有 50 个任务。当最快运行的线程完成时,另一个线程仍有 40 个任务要完成。如何让已完成的线程从另一个线程中获取 20 个任务,因此每个线程继续处理 20 个,而不是等待正在运行的线程完成剩余的 40 个?
java - how to avoid threadlocal corruption from forkjoin continuation
This question is NOT about how to use a ThreadLocal. My question is about the side effect of the ForkJoinPool continuation of ForkJoinTask.compute() which breaks the ThreadLocal contract.
In a ForkJoinTask.compute()
, I pull an arbitrary static ThreadLocal.
The value is some arbitrary stateful object but not stateful beyond the end of the compute()
call. In other words, I prepare the threadlocal object/state, use it, then dispose.
In principle you would put that state in the ForkJoinTasK, but just assume this thread local value is in a 3rd party lib I cannot change. Hence the static threadlocal, as it is a resource that all tasks instances will share.
I anticipated, tested and proved that simple ThreadLocal gets initialized only once, of course. This means that due to thread continuation beneath the ForkJoinTask.join()
call, my compute()
method can get called again before it even exited. This exposes the state of the object being used on the previous compute call, many stackframes higher.
How do you solve that undesirable exposure issue?
The only way I currently see is to ensure new threads for every compute()
call, but that defeats the F/J pool continuation and could dangerously explode the thread count.
Isn't there something to do in the JRE core to backup TL that changed since the first ForkJoinTask and revert the entire threadlocal map as if every task.compute is the first to run on the thread?
Thanks.
java - 如何处理超过默认线程数的 Java 流?
默认情况下,Java 流由使用默认参数构造的公共线程池处理。正如在另一个问题中已回答的那样,可以通过指定自定义池或设置java.util.concurrent.ForkJoinPool.common.parallelism
系统参数来调整这些默认值。
但是,我无法通过这两种方法中的任何一种来增加分配给流处理的线程数。例如,考虑下面的程序,它处理包含在其第一个参数中指定的文件中的 IP 地址列表并输出解析的地址。在具有大约 13000 个唯一 IP 地址的文件上运行此程序,我发现使用Oracle Java Mission Control的线程少至 16 个。其中,只有五个是ForkJoinPool
工人。然而,这个特定的任务将受益于更多的线程,因为线程大部分时间都在等待 DNS 响应。所以我的问题是,我怎样才能真正增加使用的线程数?
我已经在三个环境中尝试过该程序;这些是操作系统报告的线程数。
- Java SE Runtime Environment 在运行 Windows 7 的 8 核机器上构建 1.8.0_73-b02:17 个线程
- Java SE 运行时环境在运行 OS X Darwin 15.2.0 的 2 核机器上构建 1.8.0_66-b17:23 个线程
- 运行 FreeBSD 11.0 的 24 核机器上的 openjdk 版本 1.8.0_72:44 个线程
java - 在并行流上调用顺序使所有先前的操作都是顺序的
我有大量数据,想要调用缓慢但干净的方法,而不是调用对第一个结果有副作用的快速方法。我对中间结果不感兴趣,所以我不想收集它们。
明显的解决方案是创建并行流,进行慢速调用,再次使流顺序,并进行快速调用。问题是,所有代码都在单线程中执行,没有实际的并行性。
示例代码:
如果我删除sequential
,代码按预期执行,但显然,非并行操作将在多个线程中调用。
你能推荐一些关于这种行为的参考,或者一些避免临时收集的方法吗?
java - forkjoinpool 执行非递归任务并加入所有
我有一个存储在数组中的对象列表,每个对象都有一个简单的(非递归)任务来计算。
我想并行执行每个对象的这些方法,然后等待它们全部完成后再继续。
我可以知道下面的代码是否可以满足我的要求吗?有没有我忽略的问题?
谢谢。
java - ForkJoinPool 创造了大量的工人
我使用 ForkJoinPool 并行执行任务。当我查看我的程序的注销放置时,似乎 ForkJoinPool 创建了大量的工作人员来执行我的任务(有看起来像这样的日志条目:)05 Apr 2016 11:39:18,678 [ForkJoinPool-2-worker-2493] <message>
。
每个创建的任务是否有一个工作人员,然后根据我在 ForkJoinPool 中配置的并行数执行,还是我做错了什么?这是我的做法: