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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨海波 中级黑马   /  2012-6-3 01:16  /  1595 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨海波 于 2012-6-3 09:17 编辑

这2个线程调用的是同一个run方法,但是线程一和二调用的x是同一个x吗?比如线程一里的x=0和线程2 x=0
这2个x是同一个x吗?还是他们在栈中都有各自的内存空间?
  1. class Test extends Thread
  2. {
  3.         Test(String name)
  4.         
  5.         super(name);
  6. public void run()
  7. {
  8.         for(int x=0; x<90;x++)
  9.         {
  10.                 System.out.println(this.getName()+"..."+x);
  11.         }

  12. }
  13. }

  14. class ThreadTest
  15. {
  16.         public static void main(String[] args)
  17.         {
  18.         
  19.                 Test t1 = new Test("one");
  20.                 Test t2 = new Test("two");
  21.                 t1.start();
  22.                 t2.start();

  23.         }
  24. }
复制代码

5 个回复

正序浏览
你new了两个test当然不是同一个x了, 要使它们成为同一个x可以有两种方法,一种是使用静态, 还有一种就是使用单例设计模式:
class Test extends Thread
{
private static Test t= null;
private Test(){}
public static Test getInstance()
{
       if(t==null)
        {
             synchronized(Test.class)
             {
                if(t==null)
             t = new Test();
   
             }
        }  
    return t;
}        
public void run()
{
        for(int x=0; x<90;x++)
        {
                System.out.println(this.getName()+"..."+x);
        }
}
}
class ThreadTest
{
        public static void main(String[] args)
        {
        
             t1 = Test.getInstance();              
             t2 = Test.getInstance()               
                t1.start();
                t2.start();
        }
}
回复 使用道具 举报
run方法可以写类外边么??这个我真不知道!!

我感觉吧,多线程就是另一个完整的副本,所用到的变量都是各用各的,除非是是静态的变量,或者从外边传进去的参数,
回复 使用道具 举报
不是,要想把它们变成同一个的话可以把x设为成员变量并用static修饰
回复 使用道具 举报
不是, 这个X变量是一个局部变量;不同对象去调用run()方法,x也就会相应创建一次,会占内存空间,  但一旦这个方法运行完了,x变量就会被释放内存而消失 ;
回复 使用道具 举报
你创建了2了Test对象 内存自然分配了两片空间  你分别调用的run()方法 自然不是同一个x
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马