我有一个这样的课程
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参数的当前总和?
答案 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中进行更改时,你需要锁定计数器,更改值并释放锁定。