请看下面的代码,为什么这个i的位置不同输出结果不同

shenqueying 2017-11-15 10:08:44
我在简单的模拟12306,写了一个类A实现了Runnable接口,重写run方法的时候,我设置的变量 i 分别在成员变量位置跟run方法内,输出结果不同
public class Simulation12306 {
public static void main(String[] args) {
A a=new A();
Thread t1 =new Thread(a,"张三");
Thread t2 =new Thread(a,"李四");
Thread t3 =new Thread(a,"王五");

t1.start();
t2.start();
t3.start();

}
}
class A implements Runnable{
private int i=50;
@Override
public void run() {

while(true){
if(i<=0){
break;
}
System.out.println(Thread.currentThread().getName()+"抢到了"+i--);
}

}

}

如果写在run方法内,结果是每个数字都出现3次,但是写成成员变量就会只输出一次,求解,谢谢
...全文
242 9 点赞 打赏 收藏 举报
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
rumlee 2017-11-17
代码这样写,才可能有效果。

public class Simulation12306 {
    public static void main(String[] args) {
        A a=new A();
        Thread t1 =new Thread(a,"张三");
        Thread t2 =new Thread(a,"李四");
        Thread t3 =new Thread(a,"王五");
         
        t1.start();
        t2.start();
        t3.start();
         
    }
}
class A implements Runnable{
    private int i=50;
    @Override
    public void run() {
         
        while(true){
          synchronized(this){
            if(i<=0){
                break;
            }
            System.out.println(Thread.currentThread().getName()+"抢到了"+i--);
         }
         try{ Thread.sleep(100L); }catch(Exception e){}
        }
         
    }
     
}


  • 打赏
  • 举报
回复
Gump1112 2017-11-16
i是run方法变量时,三个 线程 有三个 start(),run()方法,三个线程处于同时运行状态,i是run中的,所以i不是同一个。 i是成员变量时,三个线程共同使用了一个 A类对象,i是属于A类对象a的。
  • 打赏
  • 举报
回复
qq_27035509 2017-11-16
run方法运行的时候算是私有的,但你把他变成成员变量就相当与共有的了
  • 打赏
  • 举报
回复
6点A君 2017-11-16
老铁,感觉你还没有理解线程的感念啊
  • 打赏
  • 举报
回复
从基础开始,不要大跃进
  • 打赏
  • 举报
回复
自由自在_Yu 2017-11-16
别学线程了,建议看看前面的知识。。。。。。。模拟12306 局部变量和全局变量
  • 打赏
  • 举报
回复
逗比123号 2017-11-16
但是写成成员变量就会只输出一次
  • 打赏
  • 举报
回复
李德胜1995 2017-11-15
别学线程了,建议看看前面的知识。。。。。。。模拟12306
  • 打赏
  • 举报
回复
相关推荐
发帖
Java SE
加入

6.2w+

社区成员

Java 2 Standard Edition
申请成为版主
帖子事件
创建了帖子
2017-11-15 10:08
社区公告
暂无公告