我正在尝试编写一个启动1000个线程的程序。每个线程将1添加到最初为0的变量和。通过将引用并行传递给每个线程来执行此操作,并且我被告知使用 Integer 包装器对象执行此操作持有。
代码:
public class synchronizedsum {
public static void main(String args[]){
int sum=0;
ExecutorService executor = Executors.newCachedThreadPool();
for(int i=0;i<1000;i++){
executor.execute(new Adder(sum));
}
executor.shutdown();
while(!executor.isTerminated()){
}
System.out.println(sum);
}
private static class Adder implements Runnable{
private int sum;
Adder(int sum){
this.sum = sum;
}
public synchronized void run(){
sum+=1;
}
}
}
我认为我有一些错误,因为似乎没有工作。
编辑: 我一直得到输出为0而不是1000就是问题。
编辑: 我尝试这样做似乎给了我正确的输出,但不确定它是否满足通过引用每个线程传递总和的条件。
CODE:
public class synchronizedsum {
private static Interger obj = new Interger();
public static void main(String[] args) {
ExecutorService executor = Executors.newCachedThreadPool();
for(int i=0;i<1000;i++){
executor.execute(new Add1());
}
executor.shutdown();
while(!executor.isTerminated()){
}
System.out.println(obj.getSum());
}
private static class Interger{
private volatile int sum =0;
private Lock lock = new ReentrantLock();
public void add(int amount){
lock.lock();
try {
sum+=amount;
Thread.sleep(5);
} catch (InterruptedException ex) {
Logger.getLogger(Practice.class.getName()).log(Level.SEVERE, null, ex);
} finally {
lock.unlock();
}
}
public int getSum(){
return sum;
}
}
public static class Add1 implements Runnable{
public void run(){
obj.add(1);
}
}
}
答案 0 :(得分:0)
是否会传递AtomicInteger
而不是整数帮助?您不必处理synchronized
方法,因为更新AtomicInteger
的值会为您保证。
答案 1 :(得分:0)
上面的代码是不必要的复杂。您可以使用AtomicInteger
通过简单的解决方案实现它很少有建议:
将newCachedThreadPool()
更改为newFixedThreadPool(Runtime.getRuntime().availableProcessors());
删除锁定
您可以参考此帖子中的示例代码并相应地修改您的代码。