① class A extends Thread {public void run() {}}//这是继承
main() {new A().start();}
② class A implements Runnable {public void run() {}}//这是实现接口
main() {new Thread(new A()).start();}
注意看②里面的new Thread,你说的对,单独A实现了Runnable是没有多线程的功能的,必须new Thread创建线程,然后将A的实例作为参数产给它,这样和Thread合起来才实现了线程的功能。
这两种方法是面向对象的两种设计思想的体现,即继承和组合,①是继承,将Thread继承过来,加上A自己的东西(run方法)构成完整的线程,②是组合,将Thread和A组合起来,构成线程。
线程的创建方法:
1 继承Thread类。
a,定义类继承Thread类。
b,覆盖Thread类中的run方法,将需要被多线程执行的代码定义到该run方法当中。
c,建立Thread类的子类创建线程对象。
d,调用start方法,开启线程并调用该线程的run方法。
2 实现Runnable接口。
a,定义类实现Runnable接口。
b,覆盖Runnable接口中的run方法,将需要被多线程执行的代码定义到该run方法当中。
c,通过Thread类创建线程对象。
d,将Runnable接口的子类对象作为实际参数传递给Thread类的构造函数。
e,调用Thread类的start方法,开启线程并调用Runnable接口子类对象的run方法。
这两种方式的区别:
1,实现Runnable接口是可以将资源共享。
2,实现Runnable接口避免了单继承的局限性 。
所以建议使用实现Runnable接口的方式。
|