web-dev-qa-db-ja.com

「スレッドを拡張する」よりも「実行可能な実装」が優先されるのはなぜですか?

Java Thread 自体がJava Runnable!を実装し、インターネット上の専門家のほとんどによると、- Runnableを拡張するよりもRunnableの方が好ましいRunnableを利用することはできません Threadクラスなしのスレッドの意味で!
それでは、Runnableを拡張するよりもThreadを実装するほうが好ましいのは、どちらの場合でも、Thread実装メソッド(つまりstart()またはrun()Threadの場合、run()メソッドをオーバーライドするだけでThreadの機能を本当に「拡張」するわけではありませんか?

紛らわしいと思いますが..!

25
Tariq

最も一般的な違いは次のとおりです。

Threadクラスを拡張する場合、必要な他のクラスを拡張することはできません。 (ご存じのとおり、Javaは複数のクラスの継承を許可しません。)Runnableを実装する場合、将来または現在他のクラスを拡張するためにクラス用のスペースを節約できます。

ただし、重要な違いは次のとおりです。

Threadクラスを拡張すると、各スレッドが一意のオブジェクトを作成して関連付けます。 Runnableを実装すると、複数のスレッドで同じオブジェクトを共有します。

これを確認してください: http://manikandanmv.wordpress.com/tag/extends-thread-vs-implements-runnable/

65
Aashray

クラスがThreadクラスの拡張の場合、プロパティを継承する単一のスレッドになりますThread classなので、重いです。 (extending Thread classの場合、各スレッドは一意のオブジェクトを作成して関連付けますが、Runnableの実装の場合、同じオブジェクトを複数のスレッドと共有します)。

クラスがRunnableインターフェイスの実装の場合、run()のみをオーバーライドするため、このインスタンスは個別のThreadを作成し、個々のスレッドは個別に実行されますが、プログラム内の単一の重いスレッド。もう1つ、Java多重継承をサポートしていないため、Runnableを実装するの場合、多重拡張の問題を回避できるため、実装する場合- Runnable interfaceThreadクラス以外の必要なクラスを拡張できます。

6
Maroun

クラスにはスーパークラスが1つしかありませんが、任意の数のインターフェイスを実装できます。 Threadを拡張すると、他のものをサブクラス化する機会をあきらめます。

5
minopret

Javaは単一の継承のみを許可します。つまり、Threadから継承した場合、他のクラスからは継承できません。 Runnableインターフェースの実装には、クラスが任意の数のインターフェースを実装できるため、この制限はありません。

1
Adi Lester