在1000个线程中增加Java中的AtomicInteger不会生成值1000

use*_*758 4 java multithreading

我正在执行一个java代码,我有一个AtomicInteger1000个线程正在尝试执行的代码incrementAndGet().我期待最终值为1000.但每次运行都会产生各种不同的值.代码如下:

class task implements Runnable {
    AtomicInteger i ;
    task(AtomicInteger ai) {i =ai ;}
    public void run() { i.incrementAndGet() ; }
}

class jlt {
    public static void main(String[] args) throws Exception {
        AtomicInteger atomicInt = new AtomicInteger(0);

        ExecutorService executor = Executors.newFixedThreadPool(2);
        for(int i=1; i<=1000; i++)
            executor.submit(new task(atomicInt)) ;

        executor.shutdown() ;

        System.out.println(atomicInt.get()); // 1000 is expected 
    }
}
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚我在这里或在我的理解中犯的错误

Kay*_*man 8

在打印出数字之前,你不是在等待线程完成.

添加一个executor.awaitTermination(10, TimeUnit.SECONDS)shutdown(),你可能会看到你期望的东西.


luk*_*302 3

来自https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html#shutdown()

启动有序关闭,其中执行先前提交的任务,但不会接受新任务。如果已经关闭,调用不会产生额外的效果。该方法不等待之前提交的任务完成执行。用来awaitTermination做那件事。

这意味着当您调用时,atomicInt.get()并非所有线程都已执行,并且某些线程没有机会增加 AtomicInteger。