黑马程序员技术交流社区

标题: 关于多线程 [打印本页]

作者: 胡威    时间: 2012-1-3 19:10
标题: 关于多线程
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方法啊,两个线程运行的难道不是同一个方法吗?

作者: 胡威    时间: 2012-1-3 19:16
追问:一个非静态方法加载进内存的时间
1.对象一建立方法就被加载进内存中的方法区
2.对象调用方法的时候,方法就被加载进方法区,用完就释放
请确认后再回答
作者: 为梦而战    时间: 2012-1-3 19:28
本帖最后由 为梦而战 于 2012-1-3 19:30 编辑

是你的代码写的有问题!你t1.start();t2.start();写到主函数里边去才对。你写了两个t1.start().且都不在主函数里。再一个你上面的那个"……",我看着好像一边是英语符,一边是中文符,你改一下就可以了,我改了后运行成功!
作者: 王文龙    时间: 2012-1-3 20:56
哈哈,楼上正确哦!
Thread被创建后应该是一起写在主函数中的啊,怎么还跑出去了呢??
作者: 胡威    时间: 2012-1-4 08:23
谢谢指正,不过这个不是关键,这是我往这个网页上写时写错了,原代码写的是正确的,就是毕老师的视频中讲的。麻烦再看看我提出的问题
作者: 刘基军    时间: 2012-1-4 09:41
个人认为是:
-----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. }
复制代码

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

恩,你讲得对,static可以不用,




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2