我在 forkjointask 中使用 AtmoicInteger 来计数多次达到开始条件。但是 AtomicInteger 从未使用 IncrementAndGet() 进行更新。详细代码如下,我做错了什么吗?
package Chapter7;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveAction;
import java.util.concurrent.atomic.AtomicInteger;
@SuppressWarnings("serial")
public class PrcForkJoinTask extends RecursiveAction {
private int start , end;
AtomicInteger count = new AtomicInteger(0);
public PrcForkJoinTask(int start, int end){
this.start = start;
this.end = end;
}
@Override
protected void compute() {
// TODO Auto-generated method stub
if(end - start <= 2 ){
System.out.println("close condition reached" + "Start is " + start + "end is " + end) ;
System.out.println("calculated times" + count.getAndIncrement());
}
else{
int middle = start + ((end - start) / 2);
System.out.println("middle is " + middle) ;
invokeAll( new PrcForkJoinTask(start,middle),new PrcForkJoinTask(middle,end));
}
}
public static void main(String[] args){
ForkJoinTask<?> fs = new PrcForkJoinTask(0,10);
ForkJoinPool pool = new ForkJoinPool();
pool.invoke(fs);
}
}
最佳答案
行中的每次递归
invokeAll( new PrcForkJoinTask(start,middle),new PrcForkJoinTask(middle,end));
它将使用 new AtomicInteger count = 0 创建新对象,然后在第 行加 1
System.out.println("calculated times" + count.getAndIncrement());
因此将创建多个新对象 PrcForkJoinTask,并且每个对象的 count = 1
如果您想计算摘要,您需要在新的 PrcForkJoinTask 对象内传递计数。
关于java - AtomiceInteger 没有按 forjointask 的预期增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42323049/