6

これは面接の質問としてもらった。

なぜスレッドクラスはファイナルではないのですか?なぜスレッドを拡張するのですか?

私は実際のユースケースを思い付くことができませんでした。

4

6 に答える 6

10

オラクルのドキュメントから:

新しい実行スレッドを作成するには、2 つの方法があります。1 つは、クラスを Thread のサブクラスとして宣言することです。このサブクラスはクラス Thread の run メソッドをオーバーライドする必要があります。スレッドを作成するもう 1 つの方法は、Runnable インターフェイスを実装するクラスを宣言することです。

したがって、答えは「そのメソッドThreadをオーバーライドするためにサブクラス化する必要があるかもしれません」です。run()

引用された段落は、JDK 1.1 までさかのぼる Java ドキュメントに含まれています。Java は、並行性を管理するための他の便利なクラスを追加しました。最も注目すべきは、コメントで言及されているエグゼキューターThreadです。finalただし、下位互換性が失われるため、それを行うことはできません。

実用的な理由に関する限り、今日Thread実装するのではなく拡張したい唯一の理由は、以外のRunnableメソッドをオーバーライドすることだと思います。たとえば、ログの追加や追加のクリーンアップが必要になる場合があります。 run()

于 2012-05-02T14:17:42.020 に答える
2

これは、John Vint のコメントから抜粋したものですが、これが最良の答えだと思います。

実装するのではなく、どこを拡張するを考えることができる唯一の時間(または、さらに良いことに、単にaを使用する) は、クリーンアップを行うためにオーバーライドする必要がある場合です。そうでなければ、実際に拡張する実用的な理由が見当たりません。ThreadRunnableExecutorServiceFutureThread.interrupt()Thread

于 2012-05-02T14:34:01.137 に答える
1

2 つのケース:

  1. 新しい種類の を作成するにはThread、おそらく終了後にリソースをクリーンアップするものなど
  2. run()コンストラクターにa を提供するのではなく、メソッドをオーバーライドするRunnableには (注: このパターンは避けてください。これは正しい方法ではありません)。
于 2012-05-02T14:18:11.417 に答える
1

最終的ではないもう 1 つの理由Threadは、Java の初期の頃、オーバーライドrun()は優れた設計パターンと見なされていたことです。(おそらく、無名クラスが登場する前の時代にはThreadRunnable.

Threadいずれにせよ、Java 1.0 がリリースされると、問題を最終的なものに変更して修正することは不可能でした。それは多くの既存のコードを壊していたでしょう。

于 2012-05-02T14:44:15.310 に答える