Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在1000个线程中增加Java中的AtomicInteger不会生成值1000_Java_Multithreading - Fatal编程技术网

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

在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

我正在执行一个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 
    }
}
类任务实现可运行{
原子整数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列表进行循环
将被阻止,直到完成运行或读取重复的问题;-)