ant_1024 2016-04-28 17:31 采纳率: 0%
浏览 2878
已采纳

在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


  • 写回答

7条回答 默认 最新

  • 破小孩儿 2016-04-29 01:15
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(6条)

报告相同问题?

悬赏问题

  • ¥15 做个有关计算的小程序
  • ¥15 MPI读取tif文件无法正常给各进程分配路径
  • ¥15 如何用MATLAB实现以下三个公式(有相互嵌套)
  • ¥30 关于#算法#的问题:运用EViews第九版本进行一系列计量经济学的时间数列数据回归分析预测问题 求各位帮我解答一下
  • ¥15 setInterval 页面闪烁,怎么解决
  • ¥15 如何让企业微信机器人实现消息汇总整合
  • ¥50 关于#ui#的问题:做yolov8的ui界面出现的问题
  • ¥15 如何用Python爬取各高校教师公开的教育和工作经历
  • ¥15 TLE9879QXA40 电机驱动
  • ¥20 对于工程问题的非线性数学模型进行线性化