java - AtomiceInteger 没有按 forjointask 的预期增加

标签 java multithreading atomic

我在 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/

相关文章:

java - Here-API:PDE 请求返回 GeoboundingBox 之外的 POI

java - 如何不通过引用将元素从 ArrayList 复制到另一个?

java - 如何以编程方式查找项目中的所有 Java 方法调用和给定参数?

multithreading - 如何检测和调试多线程问题?

c++ - C++ 程序末尾的 thread_local vector 段错误

java - 调用方法,将变量重命名为新变量

android - 线程并发 wait() 其他线程完成并继续其工作

python - 当查询在 Django 中以原子方式不返回任何行时,如何将新行插入表中?

java - Java 中的 Atomic Integer 和 Normal 不可变 Integer 类有什么区别?

c++ - Long Atomic Int 的实现