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)
我无法弄清楚我在这里或在我的理解中犯的错误
在打印出数字之前,你不是在等待线程完成.
添加一个executor.awaitTermination(10, TimeUnit.SECONDS)后shutdown(),你可能会看到你期望的东西.
来自https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/ExecutorService.html#shutdown()
启动有序关闭,其中执行先前提交的任务,但不会接受新任务。如果已经关闭,调用不会产生额外的效果。该方法不等待之前提交的任务完成执行。用来
awaitTermination做那件事。
这意味着当您调用时,atomicInt.get()并非所有线程都已执行,并且某些线程没有机会增加 AtomicInteger。
| 归档时间: |
|
| 查看次数: |
521 次 |
| 最近记录: |