私はJavaでのマルチスレッドプログラミングについて読んでいます。Javaの本では、タスクをスレッドから分離することが好ましい設計であると書かれています。これが何を意味するのかわかりません。
私が理解していることから、スレッドを拡張するのではなく、Runnableを実装する方が良いと理解しています。なぜなのかわかりません。
なぜ実装は拡張よりも優れているのですか?そして、いつ拡張を使用しますか?
私はJavaでのマルチスレッドプログラミングについて読んでいます。Javaの本では、タスクをスレッドから分離することが好ましい設計であると書かれています。これが何を意味するのかわかりません。
私が理解していることから、スレッドを拡張するのではなく、Runnableを実装する方が良いと理解しています。なぜなのかわかりません。
なぜ実装は拡張よりも優れているのですか?そして、いつ拡張を使用しますか?
ソフトウェア設計における重要な原則は、関心の分離です。すべてのモジュール/オブジェクト/クラス/メソッドは、明確に定義された責任を 1 つだけ持つ必要があります。
Thread クラスには、次の 2 つの懸念事項が混在しています。
実行する一連のステップを指定する (Runnable)
ランタイム システムと対話して、そのシーケンスの実行を実装する方法を管理する (この場合は、専用の CPU スレッドを使用する)
アプリケーション プログラマーは、その 2 番目の部分に気を配る必要はありません。実行したいコード パスを書き留めればよいだけです。つまり、Runnable を実装します。
その Runnable は、新しい Thread を開始するなど、さまざまな方法で実行できますが、それを ExecutionService に渡すこともできます。ランナブルをスレッドにハードコーディングすると、この柔軟性は失われます。
の利点は、コンストラクター以外のものにRunnable
を渡すことができることです。たとえば、新しい同時実行フレームワークと組み合わせて使用できます。Runnable
Thread
拡張する理由の1つは、タスクが実行中のオブジェクトにThread
直接アクセスする必要がある場合です。Thread
論理的には、IS-A 関係は構成の概念を扱うべきではありません。
したがって、スレッドクラスの拡張は、カスタムスレッドを作成したい場合に「役立ちます」。これは、すべてのスーパーメソッドの利点または特定のメソッドをオーバーライドする=>この場合、スレッドクラスの場合、ほとんどの場合、それは確かに役に立たない.
さらに、Thread を拡張すると、たとえば必要なビジネス クラスを拡張できなくなりますが、インターフェイスを使用すると、必要なクラスから拡張できます。
新しいクラスにコンセプトが必要なのか、それともコンセプトそのものなのか、常に考えなければなりません。
Thread for Business class が必要なので、それをすべての Threading 概念から分離する可能性があります => したがって、Runnable はそれをマスキングするのに十分なライトです。