Java でのマルチスレッドのプログラムと例を含むチュートリアル


どのアプリケーションでも複数のプロセス (インスタンス) を持つことができます。この各プロセスは、単一スレッドまたは複数スレッドとして割り当てることができます。このチュートリアルでは、複数のタスクを同時に実行する方法と、スレッドと syncスレッド間の同期。

この Java でのマルチスレッド チュートリアルでは、次のことを学習します。

シングルスレッドとは何ですか?

Java の単一スレッドは、基本的に軽量で最小の処理単位です。 Javaでは「スレッドクラス」というものを使ってスレッドを利用します。

糸にはXNUMX種類あります – ユーザースレッドとデーモンスレッド (デーモン スレッドは、アプリケーションをクリーンアップする場合に使用され、バックグラウンドで使用されます)。

アプリケーションが最初に開始されると、ユーザー スレッドが作成されます。 その後、多くのユーザー スレッドとデーモン スレッドを作成できます。

シングルスレッドの例:

package demotest;

public class GuruThread
{
       public static void main(String[] args) {
              System.out.println("Single Thread");
       }
}

シングルスレッドの利点:

  • システム内で単一スレッドが実行されるため、アプリケーションのオーバーヘッドが削減されます。
  • また、アプリケーションのメンテナンスコストも削減されます。

Javaのマルチスレッドとは何ですか?

マルチスレッド Javaでは、XNUMXつ以上のスレッドを同時に実行するプロセスですneoCPU の使用率を最大限に高めます。 マルチスレッド アプリケーションは、XNUMX つ以上のスレッドを同時に実行します。 したがって、Java では同時実行とも呼ばれます。 各スレッドは互いに並行して実行されます。 複数のスレッドは個別のメモリ領域を割り当てないため、メモリを節約します。 また、スレッド間のコンテキストの切り替えにかかる時間も短縮されます。

マルチスレッドの例:

package demotest;
public class GuruThread1 implements Runnable
{
       public static void main(String[] args) {
        Thread guruThread1 = new Thread("Guru1");
        Thread guruThread2 = new Thread("Guru2");
        guruThread1.start();
        guruThread2.start();
        System.out.println("Thread names are following:");
        System.out.println(guruThread1.getName());
        System.out.println(guruThread2.getName());
    }
    @Override
    public void run() {
    }
}

マルチスレッドの利点:

  • スレッドが独立しているため、ユーザーはブロックされず、複数の操作を同時に実行できます。
  • そのため、スレッドは独立しているため、XNUMX つのスレッドで例外が発生した場合でも、他のスレッドは影響を受けません。

Java のスレッドのライフサイクル

スレッドのライフサイクル:

Java のスレッドのライフサイクル
Java のスレッドのライフサイクル

上の図に示すように、スレッドのライフサイクルにはさまざまな段階があります。

  1. NEW
  2. 実行可能
  3. Running:
  4. 待っています
  5. デッド
  1. 新機能: このフェーズでは、クラス「スレッドクラス」を使用してスレッドが作成されます。プログラムが実行されるまでこの状態が維持されます。 開始 スレッド。 ボーンスレッドとも呼ばれます。
  2. 実行可能: このページでは、スレッドのインスタンスが start メソッドで呼び出されます。 スレッド制御はスケジューラに渡され、実行が終了します。 スレッドを実行するかどうかはスケジューラによって異なります。
  3. ランニング: スレッドが実行を開始すると、状態は「実行中」状態に変更されます。 スケジューラはスレッド プールから XNUMX つのスレッドを選択し、アプリケーションで実行を開始します。
  4. 待っている: これは、スレッドが待機する必要があるときの状態です。アプリケーション内で複数のスレッドが実行されているため、 syncスレッド間の同期。したがって、一方のスレッドが実行されるまで、一方のスレッドは待機する必要があります。したがって、この状態を待機状態と呼びます。
  5. デッド: スレッドが終了したときの状態です。 スレッドは実行状態にあり、処理が完了するとすぐに「停止状態」になります。


スレッドで一般的に使用されるメソッドには、次のようなものがあります。

方法 Description
開始() このメソッドはスレッドの実行を開始し、 JVM スレッド上で run() メソッドを呼び出します。
スリープ(int ミリ秒) このメソッドはスレッドをスリープ状態にするため、スレッドの実行は指定されたミリ秒間一時停止され、その後、再びスレッドの実行が開始されます。このヘルプは syncスレッドの時代化。
getName() スレッドの名前を返します。
setPriority(int newpriority) スレッドの優先度を変更します。
収率 () 現在のスレッドが停止し、他のスレッドが実行されます。

例: この Java のマルチスレッド プログラムの例では、スレッドを作成し、スレッドで使用できる組み込みメソッドを調べます。

package demotest;
public class thread_example1 implements Runnable {
    @Override
    public void run() {
    }
    public static void main(String[] args) {
        Thread guruthread1 = new Thread();
        guruthread1.start();
        try {
            guruthread1.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        guruthread1.setPriority(1);
        int gurupriority = guruthread1.getPriority();
        System.out.println(gurupriority);
        System.out.println("Thread Running");
  }
}

コードの説明:

  • コード行 2: Runnable インターフェイスを実装するクラス「thread_Example1」を作成しています (これは、スレッドによって実行されるインスタンスを持つ任意のクラスによって実装される必要があります)。
  • コード行 4: 実行可能インターフェイスの run メソッドをオーバーライドすることが必須であるため、このメソッドはそのメソッドをオーバーライドします。
  • コード行 6: ここでは、スレッドの実行を開始する main メソッドを定義しました。
  • コード行 7: ここでは、スレッドの新しいクラスをインスタンス化して、新しいスレッド名を「guruthread1」として作成しています。
  • コード行 8: 「guruthread1」インスタンスを使用してスレッドの「start」メソッドを使用します。 ここでスレッドの実行が開始されます。
  • コード行 10: ここでは、「guruthread1」インスタンスを使用するスレッドの「sleep」メソッドを使用しています。 したがって、スレッドは 1000 ミリ秒間スリープします。
  • コード9-14: ここでは、チェック例外(割り込み例外)が発生するため、try catch ブロックに sleep メソッドを配置しています。
  • コード行 15: ここでは、スレッドの優先順位をいずれかの優先順位から 1 に設定します。
  • コード行 16: ここでは getPriority() を使用してスレッドの優先度を取得しています。
  • コード行 17: ここでは getPriority から取得した値を出力しています。
  • コード行 18: ここではスレッドが実行されているテキストを書いています。

上記のコードを実行すると、次の結果が得られますwing 出力:

Java でのスレッドの例

出力:

5 はスレッドの優先度で、「実行中のスレッド」はコードの出力であるテキストです。

Javaスレッド Sync神化

マルチスレッドには、syncプログラムの異常な動作。 1 つのスレッドがデータを書き込み、別のスレッドが同時にデータを読み取ると、アプリケーション内で不整合が生じる可能性があります。

2 つ以上のスレッドで共有リソースにアクセスする必要がある場合、 syncクロニゼーションアプローチが活用されています。

Javaが提供する sync実装するための時代遅れのメソッド sync傲慢な振る舞い。

このアプローチでは、糸が内側に達すると、 synchronized ブロックの場合、他のスレッドは同じオブジェクトに対してそのメソッドを呼び出すことができません。すべてのスレッドは、そのスレッドが終了するまで待機する必要があります。 sync上品なブロックがあり、そこから出てきます。

このように、 synchronization はマルチスレッド アプリケーションに役立ちます。 1 つのスレッドは、他のスレッドが実行を終了するまで待機する必要があり、その実行が完了した場合にのみ、他のスレッドの実行が許可されます。

それは次のように書くことができますwing 形:

Synchronized(object)
{  
        //Block of statements to be synchronized
}

Java マルチスレッドの例

このマルチスレッド Java の例では、XNUMX つのスレッドを取得し、スレッドの名前を取得します。

Example1:

GuruThread1.java
package demotest;
public class GuruThread1 implements Runnable{

    /**
     * @param args
     */
    public static void main(String[] args) {
        Thread guruThread1 = new Thread("Guru1");
        Thread guruThread2 = new Thread("Guru2");
        guruThread1.start();
        guruThread2.start();
        System.out.println("Thread names are following:");
        System.out.println(guruThread1.getName());
        System.out.println(guruThread2.getName());
    }
    @Override
    public void run() {
    }
}

コードの説明:

  • コード行 3: Runnable を実装するクラス「GuruThread1」を選択しました (これは、スレッドによって実行されるインスタンスを持つ任意のクラスによって実装される必要があります)。
  • コード行 8: これはクラスのメインメソッドです
  • コード行 9: ここでは、Thread クラスをインスタンス化し、「guruThread1」という名前のインスタンスを作成し、スレッドを作成しています。
  • コード行 10: ここでは、Thread クラスをインスタンス化し、「guruThread2」という名前のインスタンスを作成し、スレッドを作成しています。
  • コード行 11: スレッド (guruThread1) を開始しています。
  • コード行 12: スレッド (guruThread2) を開始しています。
  • コード行 13: テキストを「スレッド名は次のとおりです」として出力しますwing「」
  • コード行 14: スレッド クラスのメソッド getName() を使用して、スレッド 1 の名前を取得します。
  • コード行 15: スレッド クラスのメソッド getName() を使用して、スレッド 2 の名前を取得します。

上記のコードを実行すると、次の結果が得られますwing 出力:

Java マルチスレッドの例

出力:

ここではスレッド名が次のように出力されています

  • Guru1
  • Guru2

例2:

この Java でのマルチスレッドの例では、実行可能インターフェイスの run() メソッドと start() メソッドのオーバーライドについて学び、そのクラスの XNUMX つのスレッドを作成し、それに応じて実行します。

また、2つの授業を受講しているのですが、

  • 実行可能なインターフェースを実装するものと、
  • もう XNUMX つは main メソッドを持ち、それに応じて実行されます。
package demotest;
public class GuruThread2 {
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  GuruThread3 threadguru1 = new GuruThread3("guru1");
  threadguru1.start();
  GuruThread3 threadguru2 = new GuruThread3("guru2");
  threadguru2.start();
 }
}
class GuruThread3 implements Runnable {
 Thread guruthread;
 private String guruname;
 GuruThread3(String name) {
  guruname = name;
 }
 @Override
 public void run() {
  System.out.println("Thread running" + guruname);
  for (int i = 0; i < 4; i++) {
   System.out.println(i);
   System.out.println(guruname);
   try {
    Thread.sleep(1000);
   } catch (InterruptedException e) {
    System.out.println("Thread has been interrupted");
   }
  }
 }
 public void start() {
  System.out.println("Thread started");
  if (guruthread == null) {
   guruthread = new Thread(this, guruname);
   guruthread.start();
  }
 }
}

コードの説明:

  • コード行 2: ここでは、main メソッドを含むクラス「GuruThread2」を取り上げます。
  • コード行 4: ここではクラスの main メソッドを取り上げます。
  • コード行 6 ~ 7: ここでは、クラス GuruThread3 (コードの下の行で作成) のインスタンスを「threadguru1」として作成し、スレッドを開始しています。
  • コード行 8 ~ 9: ここでは、GuruThread3 クラスの別のインスタンス (コードの下の行で作成されます) を「threadguru2」として作成し、スレッドを開始しています。
  • コード行 11: ここでは、実行可能なインターフェイスを実装するクラス「GuruThread3」を作成しています (スレッドによって実行されるインスタンスを持つ任意のクラスによって実装される必要があります)。
  • コード行 13 ~ 14: XNUMX つのクラス変数を取得し、XNUMX つはスレッド クラスの型、もう XNUMX つは文字列クラスの型です。
  • コード行 15 ~ 18: GuruThread3 コンストラクターをオーバーライドしています。このコンストラクターは、クラス変数 guruname に割り当てられる文字列型 (スレッド名) として引数を XNUMX つ取り、したがってスレッドの名前が保存されます。
  • コード行 20: ここでは、実行可能インターフェースの run() メソッドをオーバーライドしています。
  • コード行 21: println文を使用してスレッド名を出力しています。
  • コード行 22 ~ 31: ここでは、カウンターが 0 に初期化された for ループを使用しています。カウンターは 4 未満であってはなりません (任意の数値を使用できるため、ここではループは 4 回実行されます)。カウンターをインクリメントします。 スレッド名を出力し、スリープ メソッドでチェック例外が発生したため、スレッドを try-catch ブロック内で 1000 ミリ秒スリープさせます。
  • コード行 33: ここでは、実行可能インターフェイスの start メソッドをオーバーライドしています。
  • コード行 35: 「スレッドが開始されました」というテキストを出力しています。
  • コード行 36 ~ 40: ここでは、if 条件を使用して、クラス変数 guruthread に値があるかどうかを確認しています。 null の場合、名前をパラメータ (コンストラクターで割り当てられた値) として受け取るスレッド クラスを使用してインスタンスを作成しています。 その後、start() メソッドを使用してスレッドが開始されます。

上記のコードを実行すると、次の結果が得られますwing 出力:

Java でのマルチスレッドの例

出力:

スレッドが XNUMX つあるため、「スレッドが開始されました」というメッセージが XNUMX 回表示されます。

出力したスレッドの名前を取得します。

for ループに入り、カウンターとスレッド名が出力され、カウンターは 0 から始まります。

ループは 1000 回実行され、その間にスレッドは XNUMX ミリ秒スリープされます。

したがって、最初に guru1 を取得し、guru2 を取得し、次に guru2 を取得します。これは、スレッドがここで 1000 ミリ秒スリープしているためです。次に、次の guru1 と再び guru1 を取得し、スレッドが 1000 ミリ秒間スリープしているため、guru2 を取得し、次に guru1 を取得します。

まとめ

このチュートリアルでは、Java のマルチスレッド アプリケーションと、Java でシングル スレッドとマルチ スレッドを使用する方法について説明しました。

  • Java のマルチスレッドについて説明します。マルチスレッドでは、スレッドが独立しており、一度に複数の操作を実行できるため、ユーザーはブロックされません。
  • スレッドのライフサイクルのさまざまな段階は、
    • NEW
    • 実行可能
    • Running:
    • 待っています
    • デッド
  • についても学びました sync神化 これにより、アプリケーションがスムーズに実行されます。
  • Java でのマルチスレッド プログラミングにより、さらに多くのアプリケーション タスクが容易になります。