これは面接の質問としてもらった。
なぜスレッドクラスはファイナルではないのですか?なぜスレッドを拡張するのですか?
私は実際のユースケースを思い付くことができませんでした。
これは面接の質問としてもらった。
なぜスレッドクラスはファイナルではないのですか?なぜスレッドを拡張するのですか?
私は実際のユースケースを思い付くことができませんでした。
オラクルのドキュメントから:
新しい実行スレッドを作成するには、2 つの方法があります。1 つは、クラスを Thread のサブクラスとして宣言することです。このサブクラスはクラス Thread の run メソッドをオーバーライドする必要があります。スレッドを作成するもう 1 つの方法は、Runnable インターフェイスを実装するクラスを宣言することです。
したがって、答えは「そのメソッドThread
をオーバーライドするためにサブクラス化する必要があるかもしれません」です。run()
引用された段落は、JDK 1.1 までさかのぼる Java ドキュメントに含まれています。Java は、並行性を管理するための他の便利なクラスを追加しました。最も注目すべきは、コメントで言及されているエグゼキューターThread
です。final
ただし、下位互換性が失われるため、それを行うことはできません。
実用的な理由に関する限り、今日Thread
実装するのではなく拡張したい唯一の理由は、以外のRunnable
メソッドをオーバーライドすることだと思います。たとえば、ログの追加や追加のクリーンアップが必要になる場合があります。 run()
これは、John Vint のコメントから抜粋したものですが、これが最良の答えだと思います。
実装するのではなく、どこを拡張するかを考えることができる唯一の時間(または、さらに良いことに、単にaを使用する) は、クリーンアップを行うためにオーバーライドする必要がある場合です。そうでなければ、実際に拡張する実用的な理由が見当たりません。Thread
Runnable
ExecutorService
Future
Thread.interrupt()
Thread
2 つのケース:
Thread
、おそらく終了後にリソースをクリーンアップするものなどrun()
コンストラクターにa を提供するのではなく、メソッドをオーバーライドするRunnable
には (注: このパターンは避けてください。これは正しい方法ではありません)。最終的ではないもう 1 つの理由Thread
は、Java の初期の頃、オーバーライドrun()
は優れた設計パターンと見なされていたことです。(おそらく、無名クラスが登場する前の時代にはThread
、Runnable
.
Thread
いずれにせよ、Java 1.0 がリリースされると、問題を最終的なものに変更して修正することは不可能でした。それは多くの既存のコードを壊していたでしょう。