2017-02-19 6 views
1

Я использую AtmoicInteger внутри forkjointask, чтобы посчитать, что он много раз достигал начального условия. Но AtomicInteger никогда не обновлялся с помощью incrementAndGet(). Подробный код как следующий, все, что я сделал неправильно?AtomicInteger не увеличивается, как ожидалось, с forjointask

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);  
    } 
} 
+0

* Но AtomicInteger никогда не обновлялся с помощью incrementAndGet() *. Каков был ожидаемый результат? Каков был фактический результат? – CKing

+0

счет.getAndIncrement() этот один сделал обновление. так как задача будет разделена на 6 задач. ожидаемый результат для этого «счета» равен 6. – Sanchelz

+0

И каков фактический результат? – CKing

ответ

0

Каждый раз, когда в рекурсии в строке

invokeAll(new PrcForkJoinTask(start,middle),new PrcForkJoinTask(middle,end)); 

будет создавать новые объекты с новым кола AtomicInteger = 0, а затем она будет увеличена на 1 в строке

System.out.println("calculated times" + count.getAndIncrement()); 

Так многократной будут созданы новые объекты PrcForkJoinTask, и каждый из них будет иметь счет = 1

Если вы хотите для вычисления сводки вам необходимо пройти счет внутри новых объектов PrcForkJoinTask.

Смежные вопросы