两种方法的联系与区别:
1. 两种方法均需执行线程的start方法为线程分配 必须的系统资源、调度线程运行并执行线程的 run方法。
2. 在具体应用中,采用哪种方法来构造线程体要 视情况而定。通常,当一个线程已继承了另一 个类时,就应该用第二种方法来构造,即实现 Runnable接口
如果你看Thread类的源码就会发现其实:Thread类实现了Runnable,
Runnable target;
/**
* Calls the <code>run()</code> method of the Runnable object the receiver
* holds. If no Runnable is set, does nothing.
*
* @see Thread#start
*/
public void run() {
if (target != null) {
target.run();
}
}
当使用继承Thread类方式来生成线程对象时,我们需要重写 run方法,因为Thread类的run
方法此时什么事情也不做。
当使用实现Runnable方式来生成线程对象时,我们需要实现 Runnable接口的 run方法,然
后使用new Thread(new MyThread())(假如MyThread 已经实现了 Runnable接口)来
生成线程对象,这时的线程对象的 run方法就会调用MyThread类的run方法,这样
我们自己编写的 run方法就执行了。
|