在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)
,您可能会看到预期的内容。