ホームページ  >  記事  >  Java  >  Javaスレッドの5つの状態と状態遷移ルール​​の詳細説明

Javaスレッドの5つの状態と状態遷移ルール​​の詳細説明

王林
王林オリジナル
2024-02-19 17:03:06553ブラウズ

Javaスレッドの5つの状態と状態遷移ルール​​の詳細説明

Java スレッドの 5 つの状態とその変換ルールについての深い理解

1. スレッドの 5 つの状態の概要
Java では、スレッドのサイクルは、新規状態 (NEW)、準備完了状態 (RUNNABLE)、実行状態 (RUNNING)、ブロック状態 (BLOCKED)、終了状態 (TERMINATED) の 5 つの異なる状態に分けられます。

  1. 新しい状態 (NEW): スレッド オブジェクトが作成されると、そのオブジェクトは新しい状態になります。この時点で、スレッド オブジェクトはタスクを実行するのに十分なリソースを割り当てていますが、まだ run() メソッドの実行を開始していません。
  2. 準備完了状態 (RUNNABLE): スレッドが start() メソッドを呼び出すと、スレッドは準備完了状態になります。準備完了状態のスレッドには実行条件があり、CPU がコードを実行するための時間セグメントを割り当てるのを待っています。
  3. 実行状態 (RUNNING): 準備完了状態のスレッドが CPU 時間セグメントを取得すると、実行状態に入り、run() メソッドのコードの実行を開始します。スレッドは、それ自体が終了するか、別のスレッドによって中断されるまで、実行され続けます。
  4. ブロック状態 (BLOCKED): 次の状況では、スレッドはブロック状態に入ります。

    • sleep() メソッドが呼び出され、CPU リソースがアクティブになります。諦めた。
    • ロックされたリソースなどのリソースの解放を待っています。
    • スレッドは、join() メソッドで他のスレッドの完了を待ちます。
  5. 終了状態 (TERMINATED): スレッドが終了すると、終了状態になります。スレッドが run() メソッドのコードの実行を完了するか、例外またはその他の理由でスレッドが終了すると、スレッドは終了状態になります。

2. ステート間の変換規則
スレッドのステート間には一定の変換規則があり、以下にそれぞれのステート間の変換規則を紹介します。

  1. 新しい状態 (NEW) が準備完了状態 (RUNNABLE) に変換される: スレッド オブジェクトが作成され、start() メソッドが呼び出されると、スレッドは新しい状態から準備完了状態に変換されます。
  2. 準備完了状態 (RUNNABLE) を実行状態 (RUNNING) に変換する: スレッドが CPU リソースを取得すると、準備完了状態から実行状態に変換されます。
  3. 実行状態 (RUNNING) からブロッキング状態 (BLOCKED) への変換: 実行中、リソースの解放を待っているか、CPU リソースを積極的に解放しているため、スレッドはブロッキング状態になることがあります。
  4. ブロッキング状態 (BLOCKED) は準備完了状態 (RUNNABLE) に変換されます。スレッドが待機しているリソースが解放されるか、待機時間に達すると、ブロック状態から準備完了状態に変換されます。準備完了状態。
  5. 実行状態 (RUNNING) から終了状態 (TERMINATED) への変換: スレッドの run() メソッドが完了するか、例外によりスレッドが終了すると、スレッドは実行状態から終了状態 (TERMINATED) に変換されます。終了した状態。

3. コード例

以下は、スレッド状態間の変換ルールを示す簡単なコード例です:

class MyThread extends Thread {
    
    @Override
    public void run() {
        try {
            Thread.sleep(1000);
            System.out.println("线程执行完毕");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

public class ThreadStateDemo {

    public static void main(String[] args) {
        MyThread thread = new MyThread();
        System.out.println("线程创建后状态:" + thread.getState());

        thread.start();
        System.out.println("调用start()方法后状态:" + thread.getState());

        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("等待500ms后状态:" + thread.getState());

        try {
            thread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("调用join()方法后状态:" + thread.getState());
    }
}

上記のコードを実行すると、次のことがわかります。出力結果は次のとおりです。

线程创建后状态:NEW
调用start()方法后状态:RUNNABLE
等待500ms后状态:RUNNABLE
线程执行完毕
调用join()方法后状态:TERMINATED

上記のコードは、Thread クラスを継承するスレッド オブジェクト MyThread を作成します。メインスレッドでは、さまざまな段階でのスレッド オブジェクトの状態変化を観察できます。

Java スレッドの 5 つの状態とその変換ルールを深く理解することで、マルチスレッドの原理をよりよく理解し、並行プログラミングの能力をさらに向上させることができます。同時に、実際の開発プロセスにおいては、スレッドの状態の判断や処理も非常に重要です。この記事が皆様のお役に立てれば幸いです。

以上がJavaスレッドの5つの状態と状態遷移ルール​​の詳細説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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