ホームページ  >  記事  >  Java  >  Java スレッドの 5 つの状態とその特性、およびマルチスレッド環境でのパフォーマンスの詳細な説明

Java スレッドの 5 つの状態とその特性、およびマルチスレッド環境でのパフォーマンスの詳細な説明

WBOY
WBOYオリジナル
2024-02-18 19:07:05582ブラウズ

Java スレッドの 5 つの状態とその特性、およびマルチスレッド環境でのパフォーマンスの詳細な説明

Java スレッドの 5 つの状態とその特性、およびマルチスレッド環境でのパフォーマンスについて詳しく説明します

Java はオブジェクト指向プログラミング言語であり、そのマルチスレッド化に対応しています。この機能により、複数のタスクを同時に実行できるようになり、プログラムの同時実行性と応答性が向上します。 Java では、スレッドには、新規状態 (New)、実行可能状態 (Runnable)、ブロック状態 (Blocked)、待機状態 (Waiting)、および終了状態 (Terminated) の 5 つの異なる状態があります。この記事では、これら 5 つの状態の特徴を詳しく紹介し、具体的なコード例を通じてマルチスレッド環境でのパフォーマンスを示します。

1. 新しい状態 (New)
スレッドが作成されてもまだ実行が開始されていない状態を新しい状態と呼びます。新しく作成された状態では、スレッドの start() メソッドがまだ呼び出されないため、実際には実行はまだ開始されていません。この時点で、スレッド オブジェクトは作成されていますが、オペレーティング システムはそれに実行リソースを割り当てていません。

2. 実行可能状態 (Runnable)
start() メソッドによってスレッドが呼び出された後、スレッドは実行可能状態になります。この状態のスレッドは CPU を使用してタスクを実行していますが、他の優先度の高いスレッド、タイム スライスの不足、または入出力の待機により中断される可能性があります。実行可能状態では、スレッドには次の特性があります。

  1. この状態のスレッドは、オペレーティング システムのスケジューリングの基本単位です。
  2. 複数のスレッドが同時に実行され、CPU タイム スライスが各スレッドに割り当てられ、交互に実行されます。
  3. スレッドのスケジューリングはオペレーティング システムによって決定されるため、制御できません。

次は、2 つのスレッドの実行可能ステータスを示す簡単なコード例です。

class MyRunnable implements Runnable{
    public void run(){
        for(int i=0; i<10; i++){
            System.out.println(Thread.currentThread().getName() + ": " + i);
        }
    }
}

public class Main {
    public static void main(String[] args) {
        Thread t1 = new Thread(new MyRunnable());
        Thread t2 = new Thread(new MyRunnable());
        
        t1.start();
        t2.start();
    }
}

上の例では、2 つのスレッド t1 と t2 を作成し、同時に開始しました。両方のスレッドが同時に実行されるため、出力は交互に行われます。

3. ブロック状態 (Blocked)
スレッドは、特定のリソースを取得できないか、特定の条件が満たされるのを待機しているため、ブロック状態に入ります。ブロック状態のスレッドは、リソースを取得するか、条件が満たされて実行可能状態になるまで、CPU 時間を消費しません。

以下は、スレッドのブロック状態を示す簡単なコード例です:

public class Main {
    public static void main(String[] args) {
        Object lock = new Object();
        
        Thread t1 = new Thread(() -> {
            synchronized (lock) {
                try {
                    System.out.println("Thread 1 is waiting");
                    lock.wait();
                    System.out.println("Thread 1 is running again");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });

        Thread t2 = new Thread(() -> {
            try {
                Thread.sleep(2000);
                
                synchronized (lock) {
                    System.out.println("Thread 2 is waking up Thread 1");
                    lock.notify();
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        
        t1.start();
        t2.start();
    }
}

上の例では、2 つのスレッド t1 と t2 を作成しました。t1 は実行プロセスにあります。 t2 が notify() メソッドを通じてウェイクアップするまで、wait() メソッドを呼び出して待機状態になります。ここで t1 がブロックされる理由は、t2 が通知を発行するまで実行を続行できないためです。 t2 が通知を送信すると、t1 はブロックを解除し、実行可能状態に戻ります。

4. 待機状態 (Waiting)
スレッドは、他のスレッドが特定のアクションを実行するのを待つ必要があるため、待機状態に入ります。待機状態のスレッドは、通知または中断されるまで待機します。

以下は、スレッドの待機状態を示す簡単なコード例です:

public class Main {
    public static void main(String[] args) {
        Object lock = new Object();
        
        Thread t1 = new Thread(() -> {
            synchronized (lock) {
                System.out.println("Thread 1 is waiting");
                try {
                    lock.wait(); // 进入等待状态
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                
                System.out.println("Thread 1 is running again");
            }
        });

        Thread t2 = new Thread(() -> {
            try {
                Thread.sleep(2000);
                
                synchronized (lock) {
                    System.out.println("Thread 2 is waking up Thread 1");
                    lock.notify(); // 唤醒等待的线程
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        
        t1.start();
        t2.start();
    }
}

上の例では、lock.wait() メソッドを通じて t1 スレッドを待機状態にします。 , t2 スレッドが lock.notify() メソッドを通じて通知するまで。

5. 終了状態 (Terminated)
スレッドがタスクを完了するか、例外により終了すると、終了状態に入ります。終了状態のスレッドは実行されなくなっており、再度開始することはできません。

以下は、スレッドの終了ステータスを示す簡単なコード例です。

public class Main {
    public static void main(String[] args) {
        Thread t1 = new Thread(() -> {
            for(int i=0; i<10; i++){
                System.out.println(Thread.currentThread().getName() + ": " + i);
            }
        });
        
        t1.start();
        
        try {
            t1.join(); // 确保线程执行完
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        
        System.out.println("Thread 1 is terminated");
    }
}

上の例では、スレッド t1 を作成し、開始しました。次に、t1.join() メソッドを使用して、スレッドが実行終了後に後続のコードを確実に実行し続けるようにします。

要約すると、この記事では、Java スレッドの 5 つの状態と、マルチスレッド環境におけるその特性とパフォーマンスを紹介します。マルチスレッド プログラミングでは、スレッド状態の遷移と特性を理解することが重要であり、適切なスレッド状態を使用することで、プログラムの効率と信頼性を高めることができます。この記事の紹介を通じて、読者が Java スレッドの動作メカニズムをより深く理解し、実際のプロジェクトでマルチスレッド プログラミングを正しく使用できることを願っています。

以上がJava スレッドの 5 つの状態とその特性、およびマルチスレッド環境でのパフォーマンスの詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。