A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 胡威 黑马帝   /  2012-1-3 19:10  /  2414 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

class Demo implements Runnable
{
     public void run()
     {
         for(int x=0;x<70;x++)
         {
                 System.out.println(Thread.currentThread().getName()+“......”+x)     
         }
     }
}

class JoinDemo
{
     public static void main(String[] args)
     {
          Demo d=new Demo();
          Thread t1=new Thread(d);
          Thread t2=new Thread(d);
     }
     t1.start();
     t1.start();
}
打印结果为Thread-0.....0
                  Thread-1.....0等等
问:为什么两个线程会打印一样的x值呢?只有一个Demo对象,也就只有一个run方法啊,两个线程运行的难道不是同一个方法吗?

7 个回复

正序浏览
胡威 发表于 2012-1-5 09:19
你这里的x是成员变量,本来就只有一个对象,没有必要static把,我上面的代码里x是局部变量,应该不一样把 ...

恩,你讲得对,static可以不用,
回复 使用道具 举报
胡威 黑马帝 2012-1-5 09:19:32
7#
你这里的x是成员变量,本来就只有一个对象,没有必要static把,我上面的代码里x是局部变量,应该不一样把
回复 使用道具 举报
个人认为是:
-----2.对象调用方法的时候,方法就被加载进方法区,用完就释放。
共享数据使用静态修饰:static int x=70;
【下面的代码没有同步,还需完善,仅为显示效果使用】
  1. class Demo implements Runnable
  2. {
  3.         static int x=70;
  4.         public void run()
  5.         {
  6.                 while(x>=0)
  7.                 {
  8.                         System.out.println(Thread.currentThread().getName()+"......"+x);
  9.                         x--;     
  10.                 }               
  11.         }
  12. }

  13. class JoinDemo
  14. {
  15.      public static void main(String[] args)
  16.      {
  17.           Demo d=new Demo();
  18.           Thread t1=new Thread(d);
  19.           Thread t2=new Thread(d);
  20.           t1.start();
  21.                              t2.start();
  22.      }
  23.      
  24. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
谢谢指正,不过这个不是关键,这是我往这个网页上写时写错了,原代码写的是正确的,就是毕老师的视频中讲的。麻烦再看看我提出的问题
回复 使用道具 举报
哈哈,楼上正确哦!
Thread被创建后应该是一起写在主函数中的啊,怎么还跑出去了呢??
回复 使用道具 举报
本帖最后由 为梦而战 于 2012-1-3 19:30 编辑

是你的代码写的有问题!你t1.start();t2.start();写到主函数里边去才对。你写了两个t1.start().且都不在主函数里。再一个你上面的那个"……",我看着好像一边是英语符,一边是中文符,你改一下就可以了,我改了后运行成功!

评分

参与人数 1技术分 +1 收起 理由
吴上储 + 1

查看全部评分

回复 使用道具 举报
追问:一个非静态方法加载进内存的时间
1.对象一建立方法就被加载进内存中的方法区
2.对象调用方法的时候,方法就被加载进方法区,用完就释放
请确认后再回答
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马