Adi*_*tya 1 java multithreading
嗨,我在尝试挥发性.我从我的主线程创建10个线程,并从每个线程打印静态计数器的值.
输出是不确定的.任何人都可以让我知道为什么它不起作用.
public class Main {
static AtomicInteger counter = new AtomicInteger(0);
public static void main(String[] args) {
while(counter.getAndIncrement() < 10){
new Thread(new Runnable() {
@Override
public void run() {
try {
System.out.println(counter.get());
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
}
}
Run Code Online (Sandbox Code Playgroud)
在这里我也尝试改变计数器为
static volatile int counter = 0;
Run Code Online (Sandbox Code Playgroud)
我得到的输出是
3 3 6 6 7 7 10 10 11 11
输出每次都不同.我不指望它们按正确顺序排列,但我期望从0到10的唯一值.
您有一个增加值的线程,以及获取并显示该值的多个线程.显然,增量线程有很多潜力,然后其余线程打印相同的值.仅仅因为你调用start()并不意味着线程会在值递增之前运行.
如果你把它get()放在while循环中,并incrementAndGet()在其他线程中使用,你将得到唯一的值(虽然你可能会得到超过10).
如果要打印10个不同的值,代码将不起作用.
使用原始代码,您可以创建10个线程,但是当它们运行时,它们将打印计数器的当前值.如果3个启动的线程运行,它们将始终打印相同的值.
当你get()进入while循环时,它可以并且将创建超过10个线程,因为增量计数器的其他线程将没有机会运行,导致线程被创建,直到10个递增线程运行.之后仍然有剩下的线程被创建,但还没有运行 - >你得到10 +额外的线程.
如果要使用线程,则无法使用单个计数器变量获得所需的输出.
| 归档时间: |
|
| 查看次数: |
656 次 |
| 最近记录: |