`
Neil_yang
  • 浏览: 126237 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

实现Runnable为什么比继承Thread好

    博客分类:
  • JAVA
阅读更多

这个问题是个常规问题,所以它的常规答案就是:在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的。 

 

 

简单的说:Thread要继承,这样的话你就不可以继承其他的类了。
Runnable只需要实现,你同时可以继承其他的类,也可以实现其他的类。
其实 他们的功能是一样的。 

 

 

 实现Runnable比继承Thread好?
没有这么绝对吧。

你在做项目的时候,有的时候你必须要实现Runnable,而不能继承Thread。

原因很简单,因为java中,一个对象不能继承两个类,所以这个时候你只能去实现Runnable。

我在大多数时候都是继承Thread,感觉操作直来简单,好理解。

 

 

 

其实就是CPU与代码和数据分离的思想,Thread是CPU,Runnable是执行的代码。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics