ホームページ  >  記事  >  Java  >  Java の Runnable と Thread の違いは何ですか?

Java の Runnable と Thread の違いは何ですか?

WBOY
WBOY転載
2023-05-07 17:19:08939ブラウズ

Java でマルチスレッドを実装するには 2 つの方法があります。1 つは Thread クラスを継承する方法、もう 1 つは Runnable インターフェイスを実装する方法です。Thread クラスは java.lang パッケージで定義されます。クラスが Thread クラスを継承し、このクラスの run() メソッドをオーバーライドする限り、マルチスレッド操作を実装できますが、クラスが継承できる親クラスは 1 つだけであり、これがこのメソッドの制限です。

下の例を見てください:

package org.thread.demo;  class MyThread extends Thread{  private String name;  public MyThread(String name) {  super();  this.name = name;  }  public void run(){  for(int i=0;i<10;i++){  System.out.println("线程开始:"+this.name+",i="+i);  }  }  }  package org.thread.demo;  public class ThreadDemo01 {  public static void main(String[] args) {  MyThread mt1=new MyThread("线程a");  MyThread mt2=new MyThread("线程b");  mt1.run();  mt2.run();  }  }

ただし、現時点では結果は非常に規則的です。最初に最初のオブジェクトが実行され、次に 2 番目のオブジェクトが実行されますが、それらは実行されません。お互いに。 JDK ドキュメントには、start() メソッドが呼び出されると、JVM を通じて run() メソッドが見つかることが記載されています。以下では、start() メソッドを開始してスレッドを開始します。

package org.thread.demo;  public class ThreadDemo01 {  public static void main(String[] args) {  MyThread mt1=new MyThread("线程a");  MyThread mt2=new MyThread("线程b");  mt1.start();  mt2.start();  }  };

このようにして、プログラムは対話型操作を正常に完了できます。では、なぜマルチスレッドを開始するために start(); メソッドを使用する必要があるのでしょうか?

JDK インストール パスの src.zip が Java ソース プログラム全体です。このコードから Thread の start() メソッドの定義を見つけます。プライベート ネイティブ void start0() が使用されていることがわかります。 ;ネイティブ キーワードは、オペレーティング システムの基礎となる関数を呼び出すことができることを示すため、このテクノロジは JNI テクノロジ (Java ネイティブ インターフェイス)

#実行可能なインターフェイス になります。 #実際の開発では マルチスレッド操作はThreadクラスを使用することはほとんどありませんが、Runnableインターフェースを通じて完了します。

public interface Runnable{  public void run();  }

例:

package org.runnable.demo;  class MyThread implements Runnable{  private String name;  public MyThread(String name) {  this.name = name;  }public void run(){  for(int i=0;i<100;i++){  System.out.println("线程开始:"+this.name+",i="+i);  }  }  };

ただし、Runnable を使用して定義されたサブクラスには start() メソッドはなく、Thread クラスにのみ存在します。このとき Thread クラスを観察すると、 public Thread (Runnable targeter) というコンストラクターがあり、このコンストラクターは Runnable のサブクラス インスタンスを受け入れます。これは、Runnable によって実装されたマルチスレッドが Thread クラスを通じて開始できることを意味します。 (start() はシステム リソースを調整できます):

package org.runnable.demo;  import org.runnable.demo.MyThread;  public class ThreadDemo01 {  public static void main(String[] args) {  MyThread mt1=new MyThread("线程a");  MyThread mt2=new MyThread("线程b");  new Thread(mt1).start();  new Thread(mt2).start();  }  }

2 つの実装方法の違いと関連性:

プログラム開発では、マルチスレッド化されている場合は、常に Runnable インターフェイスを主に実装します。Runnable インターフェイスの実装には、Thread クラスの継承と比較して次の利点があるためです。

    ポイント継承とクラスの制限を回避します。複数のインターフェイスを継承できます。
  • リソース共有に適しています
  • チケット販売プログラムを例に挙げます。これは Thread クラスを通じて完了します:
package org.demo.dff;  class MyThread extends Thread{  private int ticket=10;  public void run(){  for(int i=0;i<20;i++){  if(this.ticket>0){  System.out.println("卖票:ticket"+this.ticket--);  }  }  }  };

以下を渡します 3つのスレッドオブジェクトを渡し、同時にチケットを販売します:

package org.demo.dff;  public class ThreadTicket {  public static void main(String[] args) {  MyThread mt1=new MyThread();  MyThread mt2=new MyThread();  MyThread mt3=new MyThread();  mt1.start();//每个线程都各卖了10张,共卖了30张票  mt2.start();//但实际只有10张票,每个线程都卖自己的票  mt3.start();//没有达到资源共享  }  }

Runnableを使えばリソースの共有が実現できます 以下に例を示します:

package org.demo.runnable;  class MyThread implements Runnable{  private int ticket=10;  public void run(){  for(int i=0;i<20;i++){  if(this.ticket>0){  System.out.println("卖票:ticket"+this.ticket--);  }  }  }  }  package org.demo.runnable;  public class RunnableTicket {  public static void main(String[] args) {  MyThread mt=new MyThread();  new Thread(mt).start();//同一个mt,但是在Thread中就不可以,如果用同一  new Thread(mt).start();//个实例化对象mt,就会出现异常  new Thread(mt).start();  }  };

プログラム内に 3 つのスレッドがあり、合計 10 枚のチケットが販売されました。チケット、つまり Runnable を使用してマルチスレッドを実装することで、リソース共有の目的を達成できます。

Runnable インターフェイスと Thread の間の接続:

public class Thread extends Objectimplements Runnable

Thread クラスもまた、 Runnable インターフェイスのサブクラス。

以上がJava の Runnable と Thread の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。