在JAVA语言中类和类之间是单继承的,而接口和接口之间是多继承的.也就是说,如果你继承了Thread类之后就再也不能继承其他的类了,这在实际开发中是相当不方便的.而实现Runnable接口就不会有这个麻烦了,因为接口是多继承的,你实现一个接口之后只要你需要就可以继续实现其他的接口而没有任何限制.从这一点上来说,实现Runnable比继承Thread要好许多。
Runnable接口只有一个方法,那就是run( ),但是如果你想对它做一些Thread对象才能做的事情(比方说toString( )里面的getName( )),你就必须用Thread.currentThread( )去获取其reference。Thread类有一个 构造函数,可以拿Runnable和线程的名字作参数。
如果对象是Runnable的,那只说明它有run( )方法。这并没有什么特别的,也就是说,不会因为它是Runnable的,就使它具备了线程的先天功能,这一点同Thread的派生类不同的。所以你必须像例程那样,用Runnable对象去创建线程。把Runnable对象传给Thread的构造函数,创建一个独立的Thread对象。接着再调用那个线程的start( ),由它来进行初始化,然后线程的调度机制就能调用run( )了。
Runnable interface的好处在于,所有东西都属于同一个类;也就是说Runnable能让你创建基类和其它接口的mixin(混合类)。如果你要访问其它东西,直接用就是了,不用再一个一个地打交道。但是内部类也有这个功能,它也可以直接访问宿主类的成员。所以这个理由不足以说服我们放弃Thread的内部类而去使用Runnable的mixin。
Runnable的意思是,你要用代码——也就是run( )方法——来描述一个处理过程,而不是创建一个表示这个处理过程的对象。在如何理解线程方面,一直存在着争议。这取决于,你是将线程看作是对象还是处理过程[68]。如果你认为它是一个处理过程,那么你就摆脱了"万物皆对象"的OO教条。但与此同时,如果你只想让这个处理过程掌管程序的某一部分,那你就没理由让整个类都成为Runnable的。
在做项目的时候,有的时候你必须要实现Runnable,而不能继承Thread。原因很简单,因为java中,一个对象不能继承两个类,所以这个时候你只能去实现Runnable。 |