假设通过实现Runnable接口创建了线程对象A,下面两种情况,第一种在同一个线程对象里创建两个不同线程,第2种在不同线程对象里创建2个线程,请问这两种情况分别在什么时候适用?假设A中有一个方法名为getData()通过run方法调用,在下边两种情况里xx yy 在run 方法里调用getData()有什么区别?刚接触java多线程,求解。。1.A impelements Runnable   
A a= new A();   
Thread xx= new Thread(a);
Thread yy= new Thread(a);
xx.start();
yy.start();  2. A impelements Runnable   
A a= new A();  
A a1= new A();  
Thread xx= new Thread(a);
Thread yy= new Thread(a1);
xx.start();
yy.start();

解决方案 »

  1.   

    2. A impelements Runnable   
    A a= new A();   
    A a1= new A();   
    Thread xx= new Thread(a);
    Thread yy= new Thread(a1);//这样没必要,因为a和a1是一样的
    //假如有A2 impelements Runnable 
    // A2 a1= new A2(); 才有意义
    xx.start();
    yy.start();
      

  2.   

    有区别,第1种情况是两个线程xx yy共同是用a对象,所以调用getData的时候有可能发生同步问题,第2种情况是xx yy分别是用不同的对象a和a1,彼此间没有任何联系,所以不存在同步问题
      

  3.   


    谢谢指教。请问一般情况下是用哪种方法?因为我同时创建的线程可能会达到1000个,用第2种方法会不会导致出现内存问题?
    假设现在有2个类 A B  分别实现了runnable接口。
    1.在A中调用ExecutorService es = Executor.newCachedThreadPool();创建了一个线程池。监听socket请求
    2.监听到一个socket请求就调用Executor的Execute方法,es.execute(new B ());从池中分配一个线程。
    3.B的构造函数
    Public B(){
    Thread b= new Thread(this);
    b.start();
    }
    在B的构造函数中初始化了一个新线程处理这条socket消息。B本身是一个线程类,在构造函数中创建新线程有问题么?