Javaのスレッドクラスと実行可能インターフェイスの違い

著者: Laura McKinney
作成日: 1 4月 2021
更新日: 10 5月 2024
Anonim
【Java入門#20】インタフェース
ビデオ: 【Java入門#20】インタフェース

コンテンツ


スレッドは2つの方法で定義できます。まず、 Threadクラスの拡張 既にRunnableインターフェイスが実装されています。第二に、直接 Runnableインターフェースの実装。 Threadクラスを拡張してスレッドを定義する場合、Threadクラスのrun()メソッドをオーバーライドする必要があります。 Runnableインターフェースを実装するスレッドを定義する場合、Runnableインターフェースの唯一のrun()メソッドを実装する必要があります。 ThreadとRunnableの基本的な違いは、Threadクラスを拡張することで定義された各スレッドが一意のオブジェクトを作成し、そのオブジェクトに関連付けられることです。一方、Runnableインターフェースを実装することで定義された各スレッドは、同じオブジェクトを共有します。

以下に示す比較チャートを使用して、スレッドとRunnableのその他の違いを観察してみましょう。

  1. 比較表
  2. 定義
  3. 主な違い
  4. 結論

比較表

比較の根拠実行可能
ベーシック各スレッドは一意のオブジェクトを作成し、それに関連付けられます。複数のスレッドが同じオブジェクトを共有します。
記憶 各スレッドが一意のオブジェクトを作成すると、より多くのメモリが必要になります。複数のスレッドが同じオブジェクトを共有するため、使用されるメモリは少なくなります。
延長Javaでは、多重継承は許可されないため、クラスがThreadクラスを拡張した後、他のクラスを拡張することはできません。クラスがRunnableインターフェイスを実装するスレッドを定義する場合、1つのクラスを拡張する可能性があります。
つかいます ユーザーは、Threadクラスの他のメソッドをオーバーライドする場合にのみ、スレッドクラスを拡張する必要があります。runメソッドのみを専門にしたい場合は、Runnableを実装することをお勧めします。
カップリング Threadクラスを拡張すると、クラスにThreadクラスのコードとスレッドに割り当てられたジョブが含まれるため、密結合が導入されますRunnableインターフェースを実装すると、ThreadのコードがThreadsのジョブとは別個であるため、疎結合が導入されます。


スレッドクラスの定義

のクラスです java.lang パッケージ。 Threadクラスは 対象 クラス、およびそれは実装します 実行可能 インターフェース。 Threadクラスには、スレッドを作成して操作するためのコンストラクターとメソッドがあります。複数のスレッドを作成すると、各スレッドは一意のオブジェクトを作成し、そのオブジェクトに関連付けられます。 Threadクラスを拡張するスレッドを作成すると、javaは多重継承をサポートしないため、さらに他のクラスを拡張することはできません。そのため、Threadクラスの他のメソッドをオーバーライドする場合にのみ、Threadクラスを拡張することを選択する必要があります。 Threadクラスを拡張するスレッドを作成する例を見てみましょう。

/ *スレッドの定義* /クラスMythread extends Thread {/ *スレッドのジョブ* / public void run(){for(int i = 0; i <10; i ++){System.Out.ln( "Child Thread" ); }}クラスmainThread {/ *メインスレッドのジョブ* / public static void main(String args){Mythread mt = new Mythread(); / *メインスレッドが子スレッドを作成しました* / mt.start(); for(int i = 0; i <10; i ++){System.Out。( "Main Thread"); }}} / * Output * /メインスレッドメインスレッドメインスレッドメインスレッド子スレッド子スレッド子スレッド子スレッド子スレッドメインスレッド子スレッドメインスレッドメインスレッド子スレッド子スレッドメインスレッドメインスレッド子スレッド子スレッドメインスレッド

上記のコードでは、Threadクラスを拡張し、ThreadクラスのrunメソッドをオーバーライドするMythreadクラスを作成します。 mainメソッドを含むクラスで、Mythreadクラスのスレッドオブジェクト(mt)を作成し、スレッドオブジェクトを使用してstart()メソッドを呼び出しました。 startメソッドは、スレッドの実行を開始すると同時に、JVMがスレッドのrunメソッドを呼び出します。これで、プログラムにはメインスレッドとメインスレッドによって作成された2番目の子スレッドの2つのスレッドがあります。両方のスレッドの実行は同時に発生しますが、正確な出力を装うことはできません。


実行可能インターフェースの定義

実行可能 のインターフェースです java.lang パッケージ。 Runnableインターフェイスを実装すると、スレッドを定義できます。実行可能なインターフェースには単一のメソッドがあります run()、 Runnableインターフェースを実装するクラスによって実装されます。 Runnableインターフェースを実装するスレッドを定義することを選択した場合、他のクラスを拡張する選択肢がまだあります。 Runnableインターフェイスを実装して複数のスレッドを作成すると、各スレッドは同じ実行可能なインスタンスを共有します。 Runnableインターフェースを使用してスレッドを定義する方法を学びましょう。

/ *スレッドの定義* /クラスRunnablethreadはRunnableを実装します{/ *スレッドのジョブ* / public void run(){for(int i = 0; i <10; i ++){System.Out.ln( "Child Thread" ); }}クラスmainThread {/ *メインスレッドのジョブ* / public static void main(String args){Mythread rt = new Mythread(); / *実行可能オブジェクトを作成したメインスレッド* / Thread t = new Thread(rt); / *メインスレッドは子スレッドを作成し、実行可能なオブジェクトを渡します* / t.start(); for(int i = 0; i <10; i ++){System.Out。( "Main Thread"); }}} / * Output * /メインスレッドメインスレッドメインスレッドメインスレッド子スレッド子スレッド子スレッド子スレッド子スレッドメインスレッド子スレッドメインスレッドメインスレッド子スレッド子スレッドメインスレッドメインスレッド子スレッド子スレッドメインスレッド

上記のコードでは、Runnableインターフェースを実装するRunnablethreadクラスを作成し、Runnableインターフェースのrun()メソッドを実装することでスレッドのジョブを定義しています。次に、mainメソッドを含むクラスメインスレッドを作成します。メインメソッド内で、クラスRunnablethreadの実行可能オブジェクトを宣言し、スレッドを宣言しながらこのオブジェクトをスレッドのコンストラクターに渡しました。このようにして、スレッドオブジェクト(t)を実行可能なオブジェクト(rt)にリンクしました。次に、スレッドオブジェクトがスレッドのstartメソッドを呼び出し、さらにそのメソッドがRunnablethreadクラスのrunメソッドを呼び出します。実行可能オブジェクトをThreadオブジェクトにリンクしていない場合、threads startメソッドはThreadクラスのrunメソッドを呼び出していました。ここでも、コードには2つのスレッドがあります。メインスレッドとメインスレッドは子スレッドを作成し、両方が同時に実行されますが、正確な出力を装うことはできません。

Javaのスレッドと実行可能ファイルの主な違い

  1. Threadクラスを拡張することによって作成された各スレッドは、そのクラスに対して一意のオブジェクトを作成し、そのオブジェクトに関連付けられます。一方、Runnableインターフェイスを実装して作成された各スレッドは、同じ実行可能なインスタンスを共有します。
  2. Threadクラスを拡張して作成された各スレッドは一意のオブジェクトに関連付けられるため、より多くのメモリが必要です。一方、Runnableインターフェイスを実装して作成された各スレッドは同じオブジェクトスペースを共有するため、必要なメモリは少なくなります。
  3. Threadクラスをさらに拡張すると、Javaは多重継承を許可しないので、Runnableを実装するとクラスが他のクラスを継承する機会が提供されるため、他のクラスを継承できます。
  4. Threadクラスの他のメソッドをオーバーライドまたは特化する必要がある場合にのみ、Threadクラスを拡張する必要があります。 runメソッドのみを特殊化する場合は、Runnableインターフェイスを実装する必要があります。
  5. Threadのコードとスレッドのジョブは同じクラスに含まれているため、Threadクラスを拡張すると、コードに密結合が導入されます。一方、Runnableインターフェースを実装すると、スレッドのコードがスレッドに割り当てられたジョブから分離されるため、コードに疎結合が導入されます。

結論:

Threadクラスを拡張する代わりにRunnableインターフェイスを実装することをお勧めします。 Runnableを実装すると、スレッドのコードがジョブをスレッドに割り当てるクラスと異なるため、コードが疎結合になります。必要なメモリが少なく、クラスが他のクラスを継承することもできます。