Javaでスレッドを使用するには2つの方法があることを知っています。
- Runable を実装する
- 延長スレッド
また、 Runableを実装する 方がThreadを拡張するよりも優れ ていることも知っています。
しかし、なぜ 1 つだけではなく、2 つの方法があるのでしょうか。
Runnableの実装がより良いアプローチである場合、別のオプションがあるのはなぜですか?
オプションが 1 つしかない場合、何が問題になるでしょうか。
Javaでスレッドを使用するには2つの方法があることを知っています。
また、 Runableを実装する 方がThreadを拡張するよりも優れ ていることも知っています。
しかし、なぜ 1 つだけではなく、2 つの方法があるのでしょうか。
Runnableの実装がより良いアプローチである場合、別のオプションがあるのはなぜですか?
オプションが 1 つしかない場合、何が問題になるでしょうか。
技術的には、実装する方法は 1 つしかありませんRunnable
。Thread
、偶然にも、まさにそれを行うので、それを拡張すると、インターフェース要件を自明に満たします。
Thread をタスクとして使用すると、並列スレッドを作成して実行するためのコンパクトな方法が提供されます
new Thread() {
public void run() {
...
}
}.start();
どちらの方法もアプローチが異なります。Runnable インターフェースを実装しても、スレッド自体を制御することはできません。また、スレッド クラスを拡張すると、派生クラスは他の基本クラスを拡張できなくなります。
したがって、ユーザーがプログラムを完全に制御したい場合は、Thread クラスの拡張が適切なオプションであり、ユーザーが他の基本クラスを柔軟に拡張したい場合は、Runnable Interface の実装が適切なオプションです。
Runnable インターフェイスを実装したとしても、スレッドを作成してタスクをスレッドとして実行できるようにする必要があります。Runnable を実装することで得られる明らかな利点は、
Thread クラスの拡張は、Runnable を内部的に実装するための単なるオプションであるため、Runnable インターフェイスを間接的に実装することになります。開発者がクラスを拡張するのを防ぐために、このクラスが final にされていないだけです。Joshua Bloch が「Effective Java」で述べているように、通常は Thread を拡張する理由はないはずです。
Thread を拡張すると、各スレッドに固有のオブジェクトが関連付けられますが、Runnable を実装すると、多くのスレッドが同じ実行可能なインスタンスを共有できます。