Javaスレッドでimplements Runnable
is preferred over extends Thread
を知っています。しかし、これが当てはまる場合、extends Thread
にはimplements Runnable
以上の利点があります。もしそうなら、これらの利点は何ですか?すべての場合において、 'implementable runnable'が勝者の場合、なぜ 'extends Thread'が存在するのですか?
答えて
Thread
の基本的な動作を変更できるようにしたい(ほとんどありませんが、ときどき)ためです。
これを拡張する必要があります。
Runnable
から実装することで、Thread
クラスのメソッドをオーバーライドして変更することはできません。
例[here](http://stackoverflow.com/questions/34905333/in-run-method-how-to-find-from-where-start- was-called/34905821#34905821) - askerは、どのスレッドがこのスレッドを作成/開始したかを知りたがっていました。コンストラクタをオーバーライドし、そうするために 'start'を行います。 – OldCurmudgeon
Java 1.0がリリースされてから20年以上が経ち、良いデザインパターンが変更されたと考えられています。しかし、Javaは下位互換性を保つことを約束しています。これは、劣悪なデザインパターンを使用するかもしれない古いコードがまだ機能することを意味します。
私のペットの憎しみの1つはStringBuffer
です。このメソッドは同期させることをお勧めしませんでしたが、数十年前に置き換えられましたが、残念ながら開発者はそれを使用できないし、 Javaを使い始めるずっと前に廃止されました。
実行ファイルとスレッドをブロックするかどうかは、 "デザインパターン"とは関係がありません。意味がありません。これらは2つの異なるユースケースのシナリオです。 – specializt
デザインパターンはコンポジション対継承です。あなたが覚えている2つの異なるユースケースは何ですか? 'Thread'のサブクラス化は、ほとんど何も上書きしないことになります。しかし、' run() ' –
は' Runnable'が何らかの形で 'Thread'に関係していると思われるようです。まあそれisnt。まったく。ランナブルはブロックされていますが、実行可能なアルゴリズムとスレッドは、非同期で独立したものです。あなたにエイリアンであるトピックについての回答を書いてはいけません。ありがとうございます。この問題は、「何が良いのか:GM作物か、悪化する最後の季節」と改訂される可能性があります。 – specializt
- 1. なぜそれが存在する場合であっても
- 2. LEFT JOINのデータセットが存在する場合と存在しない場合
- 3. 他にクラスファイルが存在する場合、そのオブジェクトファイルにクラスメソッドが存在しないのはなぜですか?
- 4. Mysqlクエリ - サブクエリが存在する場合は、サブクエリが存在する場合
- 5. Tic Tac Toeプレーヤーが勝者でない場合は?
- 6. 'および/がテキストに存在する場合のXpath構文
- 7. バンドル業者グループが存在しない場合でもなぜ使用されていますか?
- 8. pdftotextサブディレクトリ内のすべてのファイルがまだ存在しない場合
- 9. ファイルが存在しない場合は、存在しない場合
- 10. varが存在する場合のJavaScript
- 11. 値が存在する場合のネイティブアレイチェック
- 12. SQL更新が存在する場合は、存在しない場合は挿入してください。
- 13. PHPのユーザー名が既に存在していない場合
- 14. TomcatがWindowsサービスとして動作する場合、ローカルMBeanServerが存在しないのはなぜですか?
- 15. テーブルが存在し、カラムが存在しない場合にのみテーブルが存在する場合のみ複数のデータベースのテーブルにカラムを追加する
- 16. 値が頭に存在する場合
- 17. キーが存在する場合:更新を、そうでない場合:連想
- 18. リレーションシップが存在する場合にのみ、熱心な負荷
- 19. ファイルが存在しない場合にのみ作成する
- 20. 存在しない場合はINSERT、存在する場合は削除
- 21. PHP MYSQL UPDATE(存在する場合)またはINSERT(存在しない場合)?
- 22. プロセスが存在しない場合、プロセスにパイプするか?
- 23. レコードが存在しない場合は、
- 24. DynamoDB createTableが存在しない場合
- 25. result.responseText.matchが存在しない場合
- 26. sqlPreparedStatement:INSERT INTOが存在しない場合
- 27. エリクシールマップチェックが空でない場合キーが存在する
- 28. ClassNotFoundExceptionクラスが存在する場合?
- 29. GNUスクリーン接続が存在する場合、作成しない場合は
- 30. DateTimeFieldが存在する場合、フォームのonSubmitメソッドが呼び出されないのはなぜですか?
@proudandhonour:はい、私はその質問の答えを読んでいますが、すべての答えはどのように '実行可能な実装'が良いか説明しています。そして、実際にそれらの答えは私の心の中でこの質問を作りました。 – rahul
@proudandhonourあなたはこの質問に答える答えにリンクしてもよろしいですか?最初の数人では見えません。 – djechlin
シナリオを考えてみましょう。スレッドが起動すると、そのスレッドの詳細をDBに追加します。これは、run()メソッドで持っているビジネスロジックとは異なります。したがって、それを別々に保つ必要があります。したがって、start()メソッドとrun()メソッドの両方をオーバーライドします –