2016-01-22 3 views
16

Javaスレッドでimplements Runnable is preferred over extends Threadを知っています。しかし、これが当てはまる場合、extends Threadにはimplements Runnable以上の利点があります。もしそうなら、これらの利点は何ですか?すべての場合において、 'implementable runnable'が勝者の場合、なぜ 'extends Thread'が存在するのですか?

+4

@proudandhonour:はい、私はその質問の答えを読んでいますが、すべての答えはどのように '実行可能な実装'が良いか説明しています。そして、実際にそれらの答えは私の心の中でこの質問を作りました。 – rahul

+1

@proudandhonourあなたはこの質問に答える答えにリンクしてもよろしいですか?最初の数人では見えません。 – djechlin

+0

シナリオを考えてみましょう。スレッドが起動すると、そのスレッドの詳細をDBに追加します。これは、run()メソッドで持っているビジネスロジックとは異なります。したがって、それを別々に保つ必要があります。したがって、start()メソッドとrun()メソッドの両方をオーバーライドします –

答えて

30

Threadの基本的な動作を変更できるようにしたい(ほとんどありませんが、ときどき)ためです。

これを拡張する必要があります。

Runnableから実装することで、Threadクラスのメソッドをオーバーライドして変更することはできません。

+6

例[here](http://stackoverflow.com/questions/34905333/in-run-method-how-to-find-from-where-start- was-called/34905821#34905821) - askerは、どのスレッドがこのスレッドを作成/開始したかを知りたがっていました。コンストラクタをオーバーライドし、そうするために 'start'を行います。 – OldCurmudgeon

18

Java 1.0がリリースされてから20年以上が経ち、良いデザインパターンが変更されたと考えられています。しかし、Javaは下位互換性を保つことを約束しています。これは、劣悪なデザインパターンを使用するかもしれない古いコードがまだ機能することを意味します。

私のペットの憎しみの1つはStringBufferです。このメソッドは同期させることをお勧めしませんでしたが、数十年前に置き換えられましたが、残念ながら開発者はそれを使用できないし、 Javaを使い始めるずっと前に廃止されました。

+2

実行ファイルとスレッドをブロックするかどうかは、 "デザインパターン"とは関係がありません。意味がありません。これらは2つの異なるユースケースのシナリオです。 – specializt

+0

デザインパターンはコンポジション対継承です。あなたが覚えている2つの異なるユースケースは何ですか? 'Thread'のサブクラス化は、ほとんど何も上書きしないことになります。しかし、' run() ' –

+0

は' Runnable'が何らかの形で 'Thread'に関係していると思われるようです。まあそれisnt。まったく。ランナブルはブロックされていますが、実行可能なアルゴリズムとスレッドは、非同期で独立したものです。あなたにエイリアンであるトピックについての回答を書いてはいけません。ありがとうございます。この問題は、「何が良いのか:GM作物か、悪化する最後の季節」と改訂される可能性があります。 – specializt

関連する問題