Java の Runnable と Thread の違いは何ですか?
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(); } }
プログラム開発では、マルチスレッド化されている場合は、常に 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 サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

Java は、初心者と経験豊富な開発者の両方が学習できる人気のあるプログラミング言語です。このチュートリアルは基本的な概念から始まり、高度なトピックに進みます。 Java Development Kit をインストールしたら、簡単な「Hello, World!」プログラムを作成してプログラミングを練習できます。コードを理解したら、コマンド プロンプトを使用してプログラムをコンパイルして実行すると、コンソールに「Hello, World!」と出力されます。 Java の学習はプログラミングの旅の始まりであり、習熟が深まるにつれて、より複雑なアプリケーションを作成できるようになります。
