class A extends Thread
{
    public void run()
    {
        System.out.println("hello");
    }
}
public class BaseTest
{
    public static void main(String[] args)
    {
        A a = new A();
        a.start();  // 也可以改成这样new Thread(a).start(); 请教大家这两句有什么区别吗? 
        
    }
}

解决方案 »

  1.   

    new Thread(a).start()      new创建一个新的无名线程然后将a赋值给新创建的,在调用.start(),他调用的是Thread线程中的方法。a.start(); 是因为类A继承了Thread类,他包含了.start( )方法,用A创建了对象a,然后用a调用从Thread继承下来的.start( );
      

  2.   

    new Thread(a).start();这句编译起认为a只是实现了Runnable接口,
    先把a转成了Runnable,这两句的实现肯定是不一样的!
      

  3.   

    Thread已经实现了Runnable接口
    Thread存在Thread(Runnable target) 这样的构造方法来 分配新的 Thread 对象
    然后a被看作是Runnable对象,多态
    结果一样,实现结果的对象不同!
      

  4.   

    A a=new A();
    new Thread(a).start();
    new Thread(a).start();
    new Thread(a).start();
    //这样是可以运行的,并输出
    hello
    hello
    hello而改成
    A a = new A();
    a.start();
    a.start();
    a.start();
    //在输出一个hello后就出现异常了. 为什么呢?
      

  5.   

    A a=new A(); 
    new Thread(a).start(); 
    new Thread(a).start(); 
    new Thread(a).start(); 
    //这样是可以运行的,并输出 
    hello 
    hello 
    hello 
             ----------------------3个对象,每个执行一次
    而改成 
    A a = new A(); 
    a.start(); 
    a.start(); 
    a.start(); 
             ----------------------1个对象,执行3次
    //在输出一个hello后就出现异常了.  为什么呢?
      

  6.   

    new Thread(a).start(); 是因为Thread实现了Runnable接口而从新创建了线程。
    也就是说上面的代码中有三个线程,而下面却是一个线程启动三次。肯定会有错阿!
      

  7.   

    简单的说
    a.start();是线程a本身执行
    new Thread(a).start(); 这个另起一个线程来执行a
    执行的线程对象不一样,但都会执行a的run方法
      

  8.   

    再请教下楼上的朋友
    下面的两段的代码都是创建了三个对象再start(),那它们有区别吗?或者说把a作数参数传给Thread()建个Thread对象,这种方法有什么好处吗?
    A a = new A(); 
    A b= new A();
    A c = new A();
    a.start();  
    b.start();
    c.start();
    A a=new A();  
    new Thread(a).start();  
    new Thread(a).start();  
    new Thread(a).start();