并发 ExecutorService 计数器从 1 到 N

8 浏览
0 Comments

并发 ExecutorService 计数器从 1 到 N

嗨!

我正在练习并努力应对并发性。

现在,我正在尝试使用ExecutorService计算从1到N(在我的示例中是1000)的数字,但不幸的是我无法得到期望的结果。下面是我的代码:

class Exec {
AtomicInteger sum = new AtomicInteger(0);
public static void main(String[] args) {
    for (int i = 0; i < 30; i++) {
        Exec exec = new Exec();
        exec.run(exec);
    }
}
public void run(Exec exec) {
    ExecutorService executorService = Executors.newFixedThreadPool(5);
    IntStream.range(0, 1000).parallel().forEach(x -> executorService.submit(exec::synchCalc));
    executorService.shutdown();
    System.out.println(sum.get());
}
public synchronized void synchCalc() {
    sum.incrementAndGet();
} 
}

输出结果为:

940
980
976
973
1000
1000
960
968
969
996
969
969
1000
938
997
0
1000
999
1000
734
999
969
1000
238
969
999
969
971
465
999

我尝试了几种解决方法:使用volatile代替AtomicInteger,几乎同步每个方法,但结果仍然一样 - 我从来没有得到全部的1000,我真的不知道为什么。

我将非常感谢任何帮助!

0