工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> Java

プログラムと例を使用した Java チュートリアルのマルチスレッド化


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

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

シングル スレッドとは

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

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

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

シングル スレッドの例:

package demotest;

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

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

Java のマルチスレッドとは

マルチスレッド Java では、2 つ以上のスレッドを同時に実行して CPU の使用率を最大にするプロセスです。マルチスレッド アプリケーションは、同時に実行される 2 つ以上のスレッドを実行します。そのため、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() {
    }
}

マルチスレッドの利点:

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

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

<センター>

<図>

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

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

<オール>
  • 新規
  • 実行可能
  • ランニング
  • 待っています
  • 死んだ
  • <オール>
  • 新機能: このフェーズでは、クラス「スレッド クラス」を使用してスレッドが作成されます。プログラムが開始するまで、スレッドはこの状態のままです。 スレッド。生まれた糸としても知られています。
  • 実行可能: このページでは、スレッドのインスタンスが start メソッドで呼び出されます。スケジューラーにスレッド制御を渡して実行を終了させます。スレッドを実行するかどうかは、スケジューラに依存します。
  • ランニング: スレッドが実行を開始すると、状態は「実行中」状態に変更されます。スケジューラはスレッド プールから 1 つのスレッドを選択し、アプリケーションで実行を開始します。
  • 待機中: これは、スレッドが待機する必要があるときの状態です。アプリケーションで複数のスレッドが実行されているため、スレッド間の同期が必要です。したがって、一方のスレッドは、もう一方のスレッドが実行されるまで待機する必要があります。したがって、この状態は待機状態と呼ばれます。
  • 死亡: スレッドが終了したときの状態です。スレッドは実行中の状態にあり、処理が完了するとすぐに「デッド状態」になります。

  • スレッドで一般的に使用されるメソッドには次のものがあります:


    方法

    説明
    start() このメソッドはスレッドの実行を開始し、JVM はスレッドで run() メソッドを呼び出します。
    スリープ (int ミリ秒) このメソッドはスレッドをスリープ状態にするため、スレッドの実行は指定されたミリ秒間一時停止し、その後、スレッドは再び実行を開始します。これは、スレッドの同期に役立ちます。
    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");
      }
    }
    

    コードの説明:

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

    出力:

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

    Java スレッドの同期

    マルチスレッドでは、プログラムの非同期動作があります。あるスレッドがデータを書き込み、別のスレッドが同時にデータを読み取っている場合、アプリケーションに矛盾が生じる可能性があります。

    2 つ以上のスレッドが共有リソースにアクセスする必要がある場合は、同期アプローチが利用されます。

    Java は同期動作を実装する同期メソッドを提供しています。

    このアプローチでは、スレッドが同期ブロック内に到達すると、他のスレッドは同じオブジェクトでそのメソッドを呼び出すことができなくなります。すべてのスレッドは、そのスレッドが同期ブロックを終了してそこから出るまで待機する必要があります。

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

    次の形式で記述できます:

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

    Java マルチスレッドの例

    このマルチスレッド Java の例では、2 つのスレッドを取り、スレッドの名前をフェッチします。

    例 1:

    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() {
        }
    }
    

    コードの説明:

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

    出力:

    スレッド名はここに出力されています

    例 2:

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

    また、私たちは 2 つのクラスを受講しています。

    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 つあるため、「スレッドが開始されました」というメッセージが 2 回表示されます。

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

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

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

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

    まとめ

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


    Java

    1. Java Hello World プログラム
    2. C++ 関数とプログラム例
    3. 例を含む C# コレクションのチュートリアル
    4. 部分文字列と例を含む Java String indexOf() メソッド
    5. Java String charAt() メソッドと例
    6. Java String compareTo() メソッド:例での使用方法
    7. Java でのコンストラクターのオーバーロード:概要とプログラム例
    8. 素数をチェックする Java プログラム
    9. プログラム例を使用した Java の挿入ソート アルゴリズム
    10. 例を使用したJavaプログラムでの選択ソート
    11. C++ マルチスレッド