我写了以下代码段:
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()
自动 fork 了我传递给的两个RecursiveActionTry
对象之一。我的笔记本电脑只有2个核..如果我有4个核并启动了4个任务,该怎么办... invokeAll(right, left, backward, forward);
我会使用所有4个核吗?不知道,因为我只有2个核心。我还想知道是否后台的invokeAll(right,left)为第一个参数(right)调用
compute()
,为第二个参数(left)调用fork + join
。 (就像在RecursiveTask扩展中那样)。否则它将不使用并行性,对吗?顺便说一句,如果有两个以上的参数..它会在第一个上调用
compute()
并在所有其他上派生吗?提前致谢。
最佳答案
invokeAll()
调用许多在不同线程上独立执行的任务。这并不需要为每个线程使用不同的内核,但是可以在每个线程可用的情况下为每个线程使用不同的内核。细节由底层机器处理,但是本质上(简单地),如果可用的内核少于线程,它将对线程进行时间切片,以允许一个线程在一个内核上执行一定的时间,然后执行另一个,然后执行另一个(在一个循环中。)
它将对所有参数进行compute()
编码,然后是compute()
方法的责任,即在不满足工作人员阈值的情况下委派并进行 fork ,然后在copmlete时加入计算。 (不过,以两种以上的方式进行拆分是不寻常的-fork联接通常通过每次递归来工作,如有必要,将工作量一分为二。)
关于java - invokeAll它是如何工作的? (ForkJoin),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16896095/