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币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Java 用for循环和while循环画菱形
...Java课的作业,没有用到什么算法package edu.fjnu.Harry ; /** * @author Harry * */ public class Demo_test2 { /** * 编写Java程序,分别使用for循环和while循环打印菱形。 * */ /** * 此函数为用for循环打印菱形 * @param num * @auth
python练习之打印等边三角形(双for循环,四种方向)
代码 rows = 6 print('1-'*32) for i in range(rows): for j in range(rows - i): print(' *', end='') print() print('2-'*32) for i in range(rows): for j in range(i+1): print(' ...
分别用for循环和while循环在控制台打印九九乘法表
for循环打印九九乘法表如题所示,用for循环打印九九乘法表想必每个学过java的人都玩过吧。今天张二女带着我们又温顾了一遍,在这里把代码贴出来,起个标签的作用吧。 不废话上代码: //打印九九乘法表 public class NineTable { public static void main(String[] args) { // TODO Auto-generated
分别用for循环和while循环实现打印金字塔图形
需求:1、用for循环实现打印金字塔图形2、用while循环实现打印金字塔图形 public class ForWhilePyramids { public static void main(String[] args) { printForPyramids(); printWhilePyramids(); } /** * 使用for循环打印金字塔图形 */ publi
for循环和while循环优缺点
在for循环中,循环控制变量的初始化和修改都放在循环头部分,形式较简洁,且特别适用于循环次数已知的情况。 在while循环中,循环控制变量的初始化一般放在while语句之前,循环控制变量的修改一般放在循环体中,形式上不如for语句简洁,但它比较适于循环次数不易预知的情况(用某一条件控制循环)。 两种形式各有优点,但它们在功能上是等价的,可以互相转换。
分别用for循环和while循环实现九九乘法表的正向打印和颠倒打印
需求:1、使用for循环实现九九乘法表正向和颠倒打印。2、使用while循环实现九九乘法表的正向打印和颠倒打印。 public class Print99Demo { public static void main(String[] args) { printFor99(); printWhile99(); printForReverse99(); printWhileRev
循环结构(for循环和while循环的区别)
使用区别:控制条件语句所控制的那个变量,在for循环结束后,就不能再被访问到了,而while循环结束还可以继续使用,如果你想继续使用,就用while,否则推荐使用for。原因是for循环结束,该变量就从内存中消失,能够提高内存的使用效率
python循环输出三角形图案
#Copyright (c)2017, 东北大学软件学院学生 # All rightsreserved #文件名称:a.py #作 者:孔云 #问题描述:编写程序,使用双循环输出三角形图案。 #问题分析:本程序由图形知,包含5行,即外层循环执行5次,每行内容的由三部分内容组成:空格、星号、回车,分别通过两个for循环和一条print语句实现。代码如下: for i in range(1,6):
多线程:为什么在while循环中加入System.out.println,线程可以停止
在论坛看到这样一个代码, public class StopThread { private static boolean stopRequested; public static void main(String[] args) throws InterruptedException { Thread backgroundThread = new Thre
python while循环和for循环
python while循环 for循环