Java Thread 自体がJava Runnable
!を実装し、インターネット上の専門家のほとんどによると、- Runnableを拡張するよりもRunnableの方が好ましい ! Runnableを利用することはできません Threadクラスなしのスレッドの意味で!
それでは、Runnable
を拡張するよりもThread
を実装するほうが好ましいのは、どちらの場合でも、Thread
実装メソッド(つまりstart()
またはrun()
)Thread
の場合、run()
メソッドをオーバーライドするだけでThread
の機能を本当に「拡張」するわけではありませんか?
紛らわしいと思いますが..!
最も一般的な違いは次のとおりです。
Threadクラスを拡張する場合、必要な他のクラスを拡張することはできません。 (ご存じのとおり、Javaは複数のクラスの継承を許可しません。)Runnableを実装する場合、将来または現在他のクラスを拡張するためにクラス用のスペースを節約できます。
ただし、重要な違いは次のとおりです。
Threadクラスを拡張すると、各スレッドが一意のオブジェクトを作成して関連付けます。 Runnableを実装すると、複数のスレッドで同じオブジェクトを共有します。
これを確認してください: http://manikandanmv.wordpress.com/tag/extends-thread-vs-implements-runnable/
クラスがThreadクラスの拡張の場合、プロパティを継承する単一のスレッドになりますThread classなので、重いです。 (extending Thread classの場合、各スレッドは一意のオブジェクトを作成して関連付けますが、Runnableの実装の場合、同じオブジェクトを複数のスレッドと共有します)。
クラスがRunnableインターフェイスの実装の場合、run()
のみをオーバーライドするため、このインスタンスは個別のThread
を作成し、個々のスレッドは個別に実行されますが、プログラム内の単一の重いスレッド。もう1つ、Java
は多重継承をサポートしていないため、Runnableを実装するの場合、多重拡張の問題を回避できるため、実装する場合- Runnable interfaceThreadクラス以外の必要なクラスを拡張できます。
クラスにはスーパークラスが1つしかありませんが、任意の数のインターフェイスを実装できます。 Thread
を拡張すると、他のものをサブクラス化する機会をあきらめます。
Javaは単一の継承のみを許可します。つまり、Thread
から継承した場合、他のクラスからは継承できません。 Runnable
インターフェースの実装には、クラスが任意の数のインターフェースを実装できるため、この制限はありません。