32

Javaスレッド自体がJavaを実装していますRunnable!インターネット上のほとんどの専門家によると、Runnableの実装はスレッドの拡張よりも優先されます!Threadクラスがないと、スレッドの意味でRunnableを利用することはできませんが!では、どちらの場合も、実際のスレッドは実装されたメソッド(つまり、または)を呼び出すことによって記述されるのに、拡張を超えて実装することを好むのは
なぜですか?RunnableThreadThreadstart()run()ThreadThreadrun()

紛らわしいと思われる場合はお詫び申し上げます。

4

5 に答える 5

77

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

Thread クラスを拡張すると、必要な他のクラスを拡張することはできません。(ご存知のように、Java では複数のクラスを継承できません)。Runnable を実装すると、クラスのスペースを節約して、将来または現在他のクラスを拡張できます。

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

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

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

于 2013-03-18T07:15:01.847 に答える
8

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

クラスがRunnableインターフェースを実装している場合は、オーバーライドするだけです。run()したがって、このインスタンスは個別のスレッドを作成し、Thread個々のスレッドは個別に実行されますが、プログラム内の単一の重いスレッドとしては実行されません。また、多重継承Java対応していないため、Runnable を実装すれば多重拡張の問題を回避できるので、Runnable インターフェースを実装すれば、 Threadクラス以外の必要なクラスを拡張できます。

于 2013-03-18T07:16:16.707 に答える
5

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

于 2013-03-18T07:14:30.983 に答える
3

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

于 2013-03-18T07:15:18.720 に答える
-5

とにかく、Runnableを使用して同じ機能を実現できるので、Runnableを実装すると、Threadクラスを拡張する場合は不可能な他のクラスを拡張できるため、それを採用する必要があることを私は知っています。

于 2013-03-18T07:23:02.260 に答える