请看下面的代码,为什么这个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次,但是写成成员变量就会只输出一次,求解,谢谢
...全文
313 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
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
  • 打赏
  • 举报
回复
老铁,感觉你还没有理解线程的感念啊
繁华终归落尽 2017-11-16
  • 打赏
  • 举报
回复
从基础开始,不要大跃进
自由自在_Yu 2017-11-16
  • 打赏
  • 举报
回复
别学线程了,建议看看前面的知识。。。。。。。模拟12306 局部变量和全局变量
逗比123号 2017-11-16
  • 打赏
  • 举报
回复
但是写成成员变量就会只输出一次
李德胜1995 2017-11-15
  • 打赏
  • 举报
回复
别学线程了,建议看看前面的知识。。。。。。。模拟12306

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧