在1000个线程中增加Java中的AtomicInteger不会生成值1000
我正在执行一个java代码,其中有一个在1000个线程中增加Java中的AtomicInteger不会生成值1000,java,multithreading,Java,Multithreading,我正在执行一个java代码,其中有一个AtomicInteger,其中1000个线程正在尝试执行incrementAndGet()。我希望最终值是1000。但每次运行都会产生各种不同的值。代码如下: class task implements Runnable { AtomicInteger i ; task(AtomicInteger ai) {i =ai ;} public void run() { i.incrementAndGet() ; } } class j
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
}
}
类任务实现可运行{
原子整数i;
任务(原子整数ai){i=ai;}
public void run(){i.incrementAndGet();}
}
jlt类{
公共静态void main(字符串[]args)引发异常{
AtomicInteger atomicInt=新的AtomicInteger(0);
ExecutorService executor=Executors.newFixedThreadPool(2);
对于(inti=1;i,在打印出数字之前,您不会等待线程完成
在shutdown()之后添加一个executor.awaitTermination(10,TimeUnit.SECONDS)
,您可能会看到您期望的内容。来自
启动有序关闭,在该关闭中执行以前提交的任务,但不会接受新任务。如果调用已关闭,则不会产生额外效果。
此方法不会等待以前提交的任务完成执行。请使用waittermination
完成此操作
这意味着,当您调用atomicInt.get()
时,并非所有线程都已执行,有些线程没有机会递增AtomicInteger。阅读java命名约定-类名大写B)始终对循环/if/…块使用大括号。即使只有一行,也很容易出错。还要注意,只有两个线程递增计数器,而不是1000。这里的真正答案是:不要假设某个库方法会做什么。阅读它的javadoc非常清楚地记录了shutdown()
正在执行的操作。我想添加的是submit()
将返回一个Future
,您可以将其添加到列表中。一旦提交了所有操作,您就可以通过调用get()的Futures列表进行循环
将被阻止,直到完成运行或读取重复的问题;-)