Rol*_*all 5 java recursion fork-join
我写了以下片段:
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);
Run Code Online (Sandbox Code Playgroud)
我看到invokeAll()自动分叉RecursiveActionTry我传递给的两个对象之一。我的笔记本电脑只有 2 个内核……如果我有 4 个内核并启动了 4 个任务invokeAll(right, left, backward, forward);怎么办……我会使用所有 4 个内核吗?不知道,因为我只有 2 个内核。
我还想知道 invokeAll(right, left) 是否在幕后调用compute()第一个参数(右)和fork + join第二个参数(左)。(如在 RecursiveTask 扩展中应该是)。否则它不会使用并行性,是吗?顺便说一句,如果有超过 2 个参数..它是否调用compute()第一个并在所有其他参数上分叉?
提前致谢。
invokeAll()调用许多在不同线程上独立执行的任务。这不需要为每个线程使用不同的内核,但如果每个线程可用,它可以允许为每个线程使用不同的内核。细节由底层机器处理,但本质上(简单地说)如果可用内核少于线程,它会对线程进行时间切片,以便允许一个内核在一个内核上执行一段时间,然后是另一个内核,然后是另一个内核(在一个循环中。)
顺便说一句,如果有超过 2 个参数..它是否在第一个调用 compute() 并在所有其他参数上调用 fork?
它将compute()所有参数,然后compute()如果不满足工人阈值,则方法负责委托和分叉,然后在完成时加入计算。(虽然将它拆分为两种以上的方式是不寻常的 - fork join 通常通过每个递归将工作负载拆分为两个来工作,如果需要的话。)
| 归档时间: |
|
| 查看次数: |
4196 次 |
| 最近记录: |