请教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对象,互相有影响。