日期:2014-05-20  浏览次数:20730 次

请教JAVA 中 Thread的问题?
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(); 请教大家这两句有什么区别吗? 
   
  }
}


------解决方案--------------------
new Thread(a).start() new创建一个新的无名线程然后将a赋值给新创建的,在调用.start(),他调用的是Thread线程中的方法。

a.start(); 是因为类A继承了Thread类,他包含了.start( )方法,用A创建了对象a,然后用a调用从Thread继承下来的.start( );


------解决方案--------------------
new Thread(a).start();这句编译起认为a只是实现了Runnable接口,
先把a转成了Runnable,这两句的实现肯定是不一样的!
------解决方案--------------------
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后就出现异常了.

为什么呢?
------解决方案--------------------
简单的说
a.start();是线程a本身执行
new Thread(a).start(); 这个另起一个线程来执行a
执行的线程对象不一样,但都会执行a的run方法
------解决方案--------------------
用第一种方法比较好,一个原因是创建的对象少,只有3个(第二种有4个),另一个原因是,第一种方法是三个独立的对象,互不干扰,第二种是3个线程共享a对象,互相有影响。