我已经为1000个线程创建了FixedThreadPool。 每个单独的线程都需要将全局计数器加1。 因此,实际上这是编程任务的一部分,我不希望直接回答,而且我已经在这个问题上花费了几个小时。
因此,一些建议将不胜感激。这是我的代码:
public class ThreadSpawner {
private int sum = 0;
public static void main(String[] args){
ThreadSpawner ts = new ThreadSpawner();
ts.doWork();
}
public void doWork(){
ExecutorService executor = Executors.newFixedThreadPool(1000);
for(int i =0;i<1000;i++){
executor.execute(new Runnable(){
@Override
public void run() {
System.out.println("Value: " + sum + Thread.currentThread());
counter();
}
public synchronized void counter(){
sum++;
}
});
}
executor.shutdown();
}
}
该分配具体询问此问题:“编写一个启动1,000个线程的程序。每个线程将1加到变量和上 最初为0。定义一个Integer包装器对象以保存sum。有无运行程序 同步看其效果。 您可以使用newFixedThreadPool()在池中创建固定数量的线程。“
我已经为线程使用了单独的可运行taskClass进行了尝试。但是我找不到从线程内编辑sum变量的方法。
Im现在使用的这种内螺纹方式至少显示出一些正确的行为。
任何人都可以提供一些见解,以解决该问题的更正确方法是什么?
亲切的问候! Sietze
答案 0 :(得分:0)
对于任何有兴趣的人,我都提供了作者的解决方案。我认为在这种情况下发布此类解决方案是一种坏习惯,因此我将其删除。
import java.util.concurrent.*;
public class Exercise30_04 {
private int sum = new Integer(0);
public static void main(String[] args) {
Exercise30_04 test = new Exercise30_04();
System.out.println("What is sum ? " + test.sum);
}
public Exercise30_04() {
ExecutorService executor = Executors.newFixedThreadPool(1000);
for (int i = 0; i < 1000; i++) {
executor.execute(new SumTask());
}
executor.shutdown();
while(!executor.isTerminated()) {
}
}
class SumTask implements Runnable {
public void run() {
sum++;
// int value = sum.intValue() + 1;
// sum = new Integer(value);
}
}
}
此解决方案似乎在没有synced关键字的情况下运行1000的正确结果。
那么在这里实现synced关键字是否有意义? 我个人将其放在可运行类的run方法上。
无论如何,感谢大家的回应。