Java作成スレッド(実行可能なインターフェイスとスレッドクラス)
ほとんどの場合、スレッドオブジェクトをインスタンス化することにより、スレッドが作成されます。 Javaは2つの方法を定義します。
以下は、各方法を順番に説明します。
実行可能なインターフェイスの実装
スレッドを作成する最も簡単な方法は、実行可能なインターフェイスを実装するクラスを作成することです。実行可能なコード実行ユニットを抽象化します。実行可能なインターフェイスを実装することにより、各オブジェクトのスレッドを作成できます。実行可能なインターフェイスを実装するには、クラスでは、次のように宣言されている単純なラン方法()を実装する必要があります。
public void run()
run()では、コードを定義して新しいスレッドを作成できます。以下を理解することが重要です。RUN()メソッドは、他のメソッドを呼び出し、他のクラスを参照し、メインスレッドのような変数を宣言できます。唯一の違いは、run()がプログラム内の別の同時スレッド実行エントリを確立することです。 run()が戻ると、スレッドは終了します。
実行可能なインターフェイスを実装するクラスを作成したら、クラス内のスレッドクラスのオブジェクトをインスタンス化する必要があります。スレッドクラスはいくつかのコンストラクターを定義します。使用するのは次のとおりです。
スレッド(Runnable Threadob、文字列スレッド名)
このコンストラクターでは、Threadobは実行可能なインターフェイスクラスを実装するインスタンスです。これは、スレッド実行の開始点を定義します。新しいスレッドの名前はThreadNameで定義されています。
新しいスレッドが作成された後、スレッドクラスで定義されるstart()メソッドが呼び出されるまで実行されません。基本的に、start()はrun()の呼び出しを実行します。 start()メソッドは次のように宣言されます。
void start()
次の例は、新しいスレッドを作成して実行を開始することです。
// 2番目のスレッドを作成しますnewThread Runnable {//新しいスレッドT =新しいスレッドを作成します(This、 "Demo Thread"); : " + t); t.start(); //スレッドを起動} //これは2番目のスレッドのエントリポイントです。public void run(){try {for(int i = 5; i> 0; i - ){system.out.println( " + i); out .println( "exiting child thread。"); class StreadDemo {string args []){new newThread(); 0; system.out.println( " + i); );} out.println( "メインスレッドの出口")}
NewThreadコンストラクターでは、新しいスレッドオブジェクトは次のステートメントによって作成されます。
t = newスレッド(これ、 "デモスレッド");
これは、このオブジェクトでは、新しいスレッドがrun()メソッドを呼び出すことを望んでいることを示しています。次に、start()が呼び出され、スレッドの実行はrun()メソッドで開始されます。これにより、ループの子スレッドが実行を開始します。 start()を呼び出した後、newThreadコンストラクターはmain()に戻ります。メインスレッドが復元されると、forループに到達します。 2つのスレッドは実行され続け、ループが終了するまでCPUを共有します。このプログラムの出力は次のとおりです。
チャイルドスレッド:スレッド[デモスレッド、5、メイン]メインスレッド:5Childスレッド:5Childスレッド:4mainスレッド:4チャイルドスレッド:3チャイルドスレッド:3Childスレッド:1E Xiting childスレッド。 。
前述のように、マルチスレッドプログラムでは、メインスレッドは通常、実行が終了する最後のスレッドでなければなりません。実際、一部の古いJVMの場合、メインスレッドが子スレッドの前に終了する場合、Javaランタイムシステムは「ハング」する場合があります。前述のプログラムは、メインスレッドが1000ミリ秒間眠り、子スレッドはわずか500ミリ秒であるため、メインスレッドが最終的に終了することを保証します。これにより、メインスレッドが終了する前にチャイルドスレッドが終了します。要するに、スレッドが終了するのを待つより良い方法があります。
拡張スレッド
スレッドを作成する別の方法は、スレッドクラスを拡張してからそのクラスのインスタンスを作成する新しいクラスを作成することです。クラスがスレッドを継承する場合、新しいスレッドへのエントリであるrun()メソッドをオーバーロードする必要があります。また、新しいスレッド実行を開始するには、start()メソッドを呼び出す必要があります。以下は、以前のプログラムを拡張スレッドクラスで書き直すために次のことです。
// ThreadClass extends thread {//新しい2番目のスレッドSuper( "demo thread")を拡張して、2番目のスレッドを作成します(); //これは2番目のスレッドのエントリポイントです{for(int i = 5; i> 0; i-){system.out.println (「子スレッド: " + i) ");}} class ExtendThread {public static void main(string args []){new newThread(); // newスレッドTry {for(int i = 5; i> 0; i-){systemを作成します。 OUT :::::::::::::.println( "メインスレッド:" + i);メインスレッドが中断されました。 ");} system.ou t.println("メインスレッド出口 ");}}}
このプログラムは、以前のバージョンと同じ出力を生成します。チャイルドスレッドは、スレッドクラスから派生したインスタンス化されたNewThreadオブジェクトによって生成されます。 newThreadのsuper()への呼び出しに注意してください。このメソッドは、次の形式のスレッドコンストラクターを呼び出します。
パブリックスレッド(文字列スレッド名)
ここで、スレッド名はスレッド名を指定します。
適切な方法を選択してください
この時点で、なぜJavaが子供のスレッドを作成する2つの方法を持っているのか、それが良いのかと疑問に思うでしょう。すべての質問は1つのポイントに起因します。スレッドクラスは、派生クラスによって過負荷になる可能性のあるさまざまな方法を定義します。すべての方法について、過負荷にしなければならない唯一のものはrun()メソッドです。これはもちろん、実行可能なインターフェイスを実装するために必要な同じ方法です。多くのJavaプログラマーは、クラスが強化または変更された場合にのみ拡張する必要があると考えています。したがって、他のスレッド方法を過負荷にしない場合は、実行可能なインターフェイスのみを実装することをお勧めします。もちろん、決めるのはあなた次第です。ただし、この章の他の部分では、実行可能なインターフェイスを実装するクラスを適用してスレッドを作成します。