在java中,多线程调用相同的方法,如何获取此方法中参数的总和?

时间:2015-08-12 18:41:54

标签: java multithreading

我有一个这样的课程

class A{
  private B b = new B();
  public void restore(){
    b.restoreTask();
  }
}

class B{
  public void restoreTask(){
    int taskcount = somenumber;
    for(int i = 0; i<taskcount; ++i){
      do something to all tasks
    }
  }
}

会有多线程调用A.restore(),因此可能有多个restoreTask()在运行,每个restoreTask()都有一个不同值的taskcount。如何在restoreTask()中获取所有taskcount参数的当前总和?

2 个答案:

答案 0 :(得分:3)

您可以使用AtomicInteger作为计数器,因为AtomicInteger是线程安全的

class A{
      private B b = new B();
      public static AtomicInteger count = new AtomicInteger(0);
      public void restore(){
        b.restoreTask();
      }
    }

    class B{
      public void restoreTask(){
        int taskcount = somenumber;
        A.count.addAndGet(taskcount);
        for(int i = 0; i<taskcount; ++i){
          do something to all tasks
        }
      }
    }

但请记住在尝试获取计数器

的值之前加入所有线程

答案 1 :(得分:0)

class Counter{
  int a;
}

class A{
  private B b;
  public A(Counter counter) {
    b = new B(counter);
  }
  public void restore(){
    b.restoreTask();
  }
}

class B{
  public B(Counter counter) {
    this.counter = counter;
  }
  public void restoreTask(){
    int taskcount = somenumber;
    synchronized(counter) {
      ...
    }
    for(int i = 0; i<taskcount; ++i){
      do something to all tasks
    }
  }
}

每当你在taskcount中进行更改时,你需要锁定计数器,更改值并释放锁定。