2 wuzhuang12 wuzhuang12 于 2016.04.29 01:31 提问

在java多线程中用while循环和for循环输出的结果不同

public class Demo14 {

public static void main(String[] args) throws InterruptedException {

    MyThread2 thread2 = new MyThread2();
    Thread t = new Thread(thread2,"1");
    Thread t1 = new Thread(thread2,"2");
    t1.start();
    t.start();


}

}
class MyThread2 implements Runnable{
private int a = 5;
@Override
public void run() {
while(a>0){
a--;
System.out.println(Thread.currentThread

().getName()+":"+a);
}
}}

输出结果:
Thread-1:3
Thread-0:3
Thread-1:2
Thread-1:0
Thread-0:1

public class Demo14 {

public static void main(String[] args) throws InterruptedException {
    MyThread2 thread2 = new MyThread2();
    Thread t = new Thread(thread2);
    Thread t1 = new Thread(thread2);
    t1.start(); 
    t.start();
}

}

class MyThread2 implements Runnable{
private int a = 5;
@Override
public void run() {

    // TODO Auto-generated method stub
    for(int i = 0; i < a ; i++){
        System.out.println(Thread.currentThread

().getName()+":"+i);
}
}}

输出结果:
Thread-0:0
Thread-1:0
Thread-0:1
Thread-1:1
Thread-0:2
Thread-1:2
Thread-0:3
Thread-1:3
Thread-0:4
Thread-1:4


8个回答

zjysource
zjysource   2016.04.29 09:15
已采纳

你的命题是错误的:两个Demo之所以不同,因为第一个Demo打印的是同一个MyThread2对象的字段a,第二个Demo打印的是同一个MyThread2对象里的方法里的局部变量i.
第一个Demo,两个线程在字段a上存在“内存冲突”——一个线程在字段a上的操作(a--),会影响另一个线程对该字段的读取。
第二个Demo,两个线程在局部变量 i 上不存在冲突,原因是,一个方法的局部变量的生命周期始于方法的调用,终于方法调用结束。当两个线程调用这个run方法时,这个方法里的局部变量 i 在该方法的每次调用时都被创建出来,并且在方法的调用与调用之间的局部变量互相独立,互不相关。

CSDNXIAON
CSDNXIAON   2016.04.29 01:41

java两层循环练习for,while
Java 循环结构 - for, while 及 do...while
Java中循环有三种形式 while、do-while 和 for
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.04.29 08:47

因为你的两个线程同时访问的是同一个Thread2对象的同一个变量a,但是没有作同步处理,所以两个线程的运行结果有重复。
本质上跟while和for没有关系,并发环境下没有同步的访问,变量的值本身就存在不确定性。
结论就是:不是for或者while的原因。

wojiushiwo945you
wojiushiwo945you   Ds   Rxr 2016.04.29 08:52

另外,while中你打印的是a,同时a也在类减少。for你则定义临时变量i<a,a是不变的,循环打印临时变量i。
所以两个线程运行时for循环都打印了一遍i从0-4.
本质上for和while是没有区别的。

guoxiaolongonly
guoxiaolongonly   2016.04.29 09:15

没有进行同步处理就是这样 可以考虑加个同步代码块。就能按顺序输出了。
跟wihle 和for循环没什么关系 。 这样的写法你开两次for循环结果都会是不一样的。 跟线程执行速度有快有慢

donggua3694857
donggua3694857   Rxr 2016.04.29 09:49

没有做同步得出的结果就是随机的,线程执行有快有慢,不是for和while的原因

fk002008
fk002008   2016.04.29 10:17

不是while和for 的问题
是多线程本来就是改变了程序的运行顺序,导致结果具有一定的不确定性。

wuzhuang12
wuzhuang12   2016.04.29 11:37

好像明白了,我去改下代码,谢谢各位。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!