Java ForkJoinTask.getSurplusQueuedTaskCount()的用法
提到: 下面的示例演示了一些可能导致更好性能的改进和习惯用法:递归操作不需要完全递归,只要它们保持基本的分而治之方法。这里有一个类,它将双数组中每个元素的平方求和,方法是将重复除法的右侧仅细分为2,并通过一系列后续引用跟踪它们它使用基于方法getSurplusQueuedTaskCount的动态阈值,但通过直接对未排序的任务执行叶操作而不是进一步细分来抵消潜在的多余分区 相关代码:Java ForkJoinTask.getSurplusQueuedTaskCount()的用法,java,multithreading,Java,Multithreading,提到: 下面的示例演示了一些可能导致更好性能的改进和习惯用法:递归操作不需要完全递归,只要它们保持基本的分而治之方法。这里有一个类,它将双数组中每个元素的平方求和,方法是将重复除法的右侧仅细分为2,并通过一系列后续引用跟踪它们它使用基于方法getSurplusQueuedTaskCount的动态阈值,但通过直接对未排序的任务执行叶操作而不是进一步细分来抵消潜在的多余分区 相关代码: protected void compute() { int l = lo; int h = hi; App
protected void compute() {
int l = lo;
int h = hi;
Applyer right = null;
while (h - l > 1 && getSurplusQueuedTaskCount() <= 3) {
int mid = (l + h) >>> 1;
right = new Applyer(array, mid, h, right);
right.fork();
h = mid;
}
double sum = atLeaf(l, h);
while (right != null) {
if (right.tryUnfork()) // directly calculate if not stolen
sum += right.atLeaf(right.lo, right.hi);
else {
right.join();
sum += right.result;
}
right = right.next;
}
result = sum;
}
受保护的void compute(){
int l=低;
int h=hi;
Applyer right=null;
而(h-l>1&&get盈余queuedtaskcount()>>1;
右=新应用层(阵列、中间、h、右);
对。fork();
h=中等;
}
双倍和=atLeaf(l,h);
while(右!=null){
if(right.tryUnfork())//如果没有被盗,直接计算
sum+=right.atLeaf(right.lo,right.hi);
否则{
对。join();
总和+=正确的结果;
}
right=right.next;
}
结果=总和;
}
我只是想知道get盈余queuedtaskcount()的推理3
表示本地排队的任务
超过其他工作线程
。因此,其他工作线程
已经非常繁忙,无法窃取任何新创建的任务。因此,当前线程应该执行计算,而不是细分计算(即创建新任务)
我的猜测正确吗