java – invokeAll它是如何工作的? (ForkJoin)
作者:互联网
我写了以下代码片段:
static private int counter;
public void compute()
{
if (array.length<=500)
{
for(int i = 0;i<array.length;i++){
counter++;
System.out.println("Ciao this is a recursive action number"+ counter+Thread.currentThread().getName());
}
}
else{
int split = array.length/2;
RecursiveActionTry right = new RecursiveActionTry(split);
RecursiveActionTry left = new RecursiveActionTry(split);
invokeAll(right, left);
我看到invokeAll()自动派生我传递给的两个RecursiveActionTry对象中的一个.我的笔记本电脑只有2个内核..如果我有4个内核并启动4个任务怎么办… invokeAll(右,左,后,前);我会使用所有4个核心吗?不知道因为我只有2个核心.
我还想知道后面的invokeAll(右,左)是否为第一个参数调用compute()(右),为第二个参数调用fork join(左). (如在RecursiveTask扩展中应该是).否则它不会使用并行性,是吗?
顺便说一句,如果有超过2个参数..它是在第一个上调用compute()而在所有其他上调用吗?
提前致谢.
解决方法:
invokeAll()调用许多在不同线程上独立执行的任务.这并不需要为每个线程使用不同的核心,但是如果它们可用,它可以允许为每个线程使用不同的核心.细节由底层机器处理,但基本上(简单地说)如果可用的核心少于线程,则它会对线程进行切片,以便允许一个核心在一个核心上执行一段时间,然后是另一个核心,然后是另一个核心(在循环中.)
And by the way, if there are more than 2 arguments.. does it call compute() on the first and fork on all the others?
它会计算()所有参数,然后如果不满足工作者阈值,则计算()方法的委托和分叉的责任,然后在copmlete时加入计算. (拆分它超过两种方式是不寻常的 – fork连接通常适用于每次递归,如果需要,将工作负载分成两部分.)
标签:java,recursion,fork-join 来源: https://codeday.me/bug/20190625/1284048.html