ホームページ > Java > &#&チュートリアル > Java スレッドのいくつかの状態と、それらがプログラム実行に及ぼす影響についての詳細な研究

Java スレッドのいくつかの状態と、それらがプログラム実行に及ぼす影響についての詳細な研究

PHPz
リリース: 2024-02-21 23:27:04
オリジナル
1050 人が閲覧しました

Java スレッドのいくつかの状態と、それらがプログラム実行に及ぼす影響についての詳細な研究

Java スレッドのいくつかの状態とそれらがプログラム実行に及ぼす影響についての詳細な研究

Java では、スレッドはプログラムを独立して実行できる軽量の実行単位です。そして特定のタスクを実行します。スレッドのステータスは、スレッド実行のさまざまな段階を表します。スレッドのステータスを理解することは、マルチスレッド プログラムを作成し、プログラムのパフォーマンスを最適化するために非常に重要です。この記事では、Java スレッドのいくつかの状態とそれがプログラムの実行に与える影響について詳しく説明し、具体的なコード例を示します。

Java スレッドのいくつかの状態には、NEW (新規)、RUNNABLE (実行可能)、BLOCKED (ブロックされた)、WAITING (待機中)、TIMED_WAITING (時間指定待機)、および TERMINATED (終了) があります。

  1. 新しい (NEW) 状態: Thread クラスのインスタンスを作成して新しいスレッドが作成されると、スレッドは新しい状態になります。新しい状態では、スレッドはまだコードの実行を開始していません。以下は、新しいスレッドを作成するためのサンプル コードです。
Thread thread = new Thread(() -> {
    System.out.println("Hello, World!");
});
ログイン後にコピー
  1. 実行可能 (RUNNABLE) 状態: スレッドが start() メソッドを呼び出すと、スレッドは実行可能状態に入ります。この状態では、スレッドは run() メソッドのコードを実行するために CPU がタイム スライスを割り当てるのを待ちます。実行可能な状態にあるスレッドが複数ある場合、オペレーティング システムは、スケジューリング ポリシーに従って、これらのスレッドにタイム スライスを割り当てます。以下はサンプル コードです。
Thread thread = new Thread(() -> {
    System.out.println("Hello, World!");
});
thread.start();
ログイン後にコピー
  1. ブロック (BLOCKED) 状態: スレッドが何らかの理由で実行を続行できない場合、スレッドはブロック状態に入ります。一般的な理由には、ロックの待機、入出力 (I/O) の待機などが含まれます。ブロッキング状態では、スレッドは特定の条件が満たされるまで実行を一時停止し、その後実行を継続します。以下に、synchronized キーワードを使用してスレッド同期を実現するサンプル コードを示します。
public class MyRunnable implements Runnable {
    private Object lock = new Object();
    
    public void run() {
        synchronized(lock) {
            System.out.println("In synchronized block");
            // 一些代码
        }
    }
  
    public static void main(String[] args) {
        MyRunnable runnable = new MyRunnable();
        Thread thread1 = new Thread(runnable);
        Thread thread2 = new Thread(runnable);
  
        thread1.start();
        thread2.start();
    }
}
ログイン後にコピー

上記のコードでは、ロックが共有されているため、2 つのスレッドが同時に synchronized ブロックに入ろうとしています。 2 番目のスレッド 最初のスレッドが実行を完了してロックを解放するまで、ブロック状態になります。

  1. 待機 (WAITING) 状態: スレッドは、wait() メソッドが呼び出される、join() メソッドが呼び出される、または park() メソッドが呼び出される状況下で待機状態に入ります。 LockSupport が呼び出されます。待機状態では、他のスレッドがウェイクアップするか待機時間が経過するまで、スレッドはコードを積極的に実行しません。以下は、wait() メソッドを使用したサンプル コードです。
public class MyThread extends Thread {
    public void run() {
        synchronized(this) {
            System.out.println("Waiting for next thread...");
            try {
                wait();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("Thread resumed.");
        }
    }
  
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start();
  
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        synchronized(thread) {
            thread.notify();
        }
    }
}
ログイン後にコピー

上記のコードでは、スレッドが待機状態に入った後、メイン スレッドは、notify() メソッドを通じてスレッドを起動します。

  1. 時限待機 (TIMED_WAITING) 状態: スレッドは、次の状況下で時限待機状態に入ります: sleep() メソッドが呼び出され、タイムアウト パラメータを指定した join() メソッドが呼び出され、タイムアウトパラメータを持つスレッドが呼び出されます。 タイムアウトパラメータの wait() メソッド、LockSupport の parkNanos() メソッド、または parkUntil() メソッドが呼び出されます。スケジュールされた待機状態では、スレッドはコードを積極的に実行せず、待機時間に達するとウェイクアップされます。以下は、sleep() メソッドを使用したサンプル コードです。
public class MyThread extends Thread {
    public void run() {
        try {
            System.out.println("Thread sleeping...");
            Thread.sleep(2000);
            System.out.println("Thread woke up.");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
  
    public static void main(String[] args) {
        MyThread thread = new MyThread();
        thread.start();
    }
}
ログイン後にコピー

上記のコードでは、スレッドは sleep() メソッドを呼び出すことによってスケジュールされた待機状態に入り、待機状態になるまで 2 秒待機します。起きた。

  1. 終了 (TERMINATED) 状態: スレッドが run() メソッドのコードの実行を終了すると、スレッドは終了状態になります。終了状態では、スレッドは実行されなくなります。

要約すると、スレッドのステータスはプログラムの実行に重要な影響を与えます。さまざまな状態とその意味を理解することは、効率的なマルチスレッド プログラムを作成するために重要です。

参考資料:

  • Oracle 公式ドキュメント - Java スレッドのステータス: https://docs.oracle.com/javase/8/docs/api/java/lang/Thread。 State.html
  • Java マルチスレッド入門チュートリアル: https://www.journaldev.com/1162/java-thread-tutorial

以上がJava スレッドのいくつかの状態と、それらがプログラム実行に及ぼす影響についての詳細な研究の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート