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

我正在执行一个java代码,其中我有一个AtomicInteger ,1000个线程正在尝试执行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 } } 

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

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

启动有序关闭,其中先前提交的任务将被执行,但不会接受任何新任务。 如果已经关闭,调用没有其他影响。 此方法不会等待先前提交的任务完成执行。 使用awaitTermination来做到这一点。

这意味着当你调用atomicInt.get()并不是所有的线程都被执行了,有些线程没有机会增加AtomicInteger。

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

shutdown() executor.awaitTermination(10, TimeUnit.SECONDS)之后添加executor.awaitTermination(10, TimeUnit.SECONDS) ,您可能会看到预期的内容。