ホームページ  >  記事  >  Java  >  Java スレッド状態変更のメカニズムと適用範囲についての詳細な説明

Java スレッド状態変更のメカニズムと適用範囲についての詳細な説明

WBOY
WBOYオリジナル
2024-02-18 14:52:06553ブラウズ

Java スレッド状態変更のメカニズムと適用範囲についての詳細な説明

Java スレッド状態遷移の原理とアプリケーション シナリオ

はじめに:
マルチスレッド プログラミング言語として、Java はスレッドを使用して同時実行を実現し、プログラムの実行効率が向上します。 Java では、スレッドの状態は非常に重要な概念であり、スレッドが実行できる操作とスレッドが動作する状態を決定します。この記事では、Java スレッドの状態遷移を原理とアプリケーション シナリオの 2 つの側面から分析します。

1. スレッド状態遷移の原理
Java では、スレッドには、新規、実行可能、ブロック済み、待機中、時間指定待機、および終了の 6 つの状態があります。スレッドのステータスは、さまざまなメソッドを呼び出すことによって変換されます。

  1. 新しい状態:
    スレッド オブジェクトを作成して start() メソッドを呼び出すと、スレッドは新しい状態になります。 New 状態のスレッドはまだ実行を開始していません。start() メソッドを呼び出すことで開始できます。

コード例:

Thread thread = new Thread();
thread.start();
  1. 実行可能状態:
    スレッドが開始されると、スレッドは実行可能状態になります。実行可能状態のスレッドが Java 仮想マシンで実行されており、実行中か、リソースを待機している可能性があります。

コード例:

public class MyThread implements Runnable{
    public void run(){
        // 线程执行的代码逻辑
    }
}

public class Main{
    public static void main(String[] args){
        MyThread myThread = new MyThread();
        Thread thread = new Thread(myThread);
        thread.start();
    }
}
  1. ブロック状態:
    スレッドがロックの取得を待機していて、別のスレッドがすでにロックを取得している場合、スレッドはブロックされた状態。 Blocked 状態のスレッドは、他のスレッドがロックを解放するのを待ってから、ロックを取得するために競合します。

コード サンプル:

public class MyThread implements Runnable{
    public void run(){
        synchronized (lock){
            // 获取锁之后执行的代码逻辑
        }
    }
}

public class Main{
    public static void main(String[] args){
        MyThread myThread1 = new MyThread();
        MyThread myThread2 = new MyThread();
        Thread thread1 = new Thread(myThread1);
        Thread thread2 = new Thread(myThread2);
        thread1.start();
        thread2.start();
    }
}
  1. 待機状態:
    スレッドが特定の条件が満たされるのを待機すると、スレッドは待機状態に入ります。待機条件としては、別のスレッドからの通知や指定時刻の到着などが考えられます。

コード例:

public class MyThread implements Runnable{
    public void run(){
        synchronized (lock){
            try{
                lock.wait(); // 等待其他线程的通知
            }catch(InterruptedException e){
                e.printStackTrace();
            }
        }
    }
}

public class Main{
    public static void main(String[] args){
        MyThread myThread = new MyThread();
        Thread thread = new Thread(myThread);
        thread.start();
        
        // 唤醒等待的线程
        synchronized (lock){
            lock.notify();
        }
    }
}
  1. Timed Waiting status:
    スレッドがロックの取得に失敗した場合、または指定された時間待機しても他の条件が満たされなかった場合、時間指定待機状態になります。

コード例:

public class MyThread implements Runnable{
    public void run(){
        try{
            Thread.sleep(2000); // 等待2秒钟
        }catch(InterruptedException e){
            e.printStackTrace();
        }
    }
}

public class Main{
    public static void main(String[] args){
        MyThread myThread = new MyThread();
        Thread thread = new Thread(myThread);
        thread.start();
    }
}
  1. 終了状態:
    スレッドの run() メソッドの実行が完了すると、スレッドは終了状態になります。 Terminated 状態のスレッドは実行を終了しました。

コード例:

public class MyThread implements Runnable{
    public void run(){
        // 线程执行的代码逻辑
    }
}

public class Main{
    public static void main(String[] args){
        MyThread myThread = new MyThread();
        Thread thread = new Thread(myThread);
        thread.start();
        try{
            thread.join(); // 等待线程执行完成
        }catch(InterruptedException e){
            e.printStackTrace();
        }
    }
}

2. スレッド状態変換の応用シナリオ
スレッド状態変換には、マルチスレッド プログラミングにおける幅広い応用シナリオがあります。スレッドのステータスに応じて、さまざまなスレッド動作を実装できます。

  1. ブロック状態を使用して、スレッド間の相互排他的アクセスを実現します。
    一部のアプリケーション シナリオでは、複数のスレッドによる共有リソースへの相互排他的アクセスを保証する必要があります。 Blocked 状態を使用すると、スレッド間の相互排他的アクセスを実現できます。

コード例:

public class MyThread implements Runnable{
    public void run(){
        synchronized(lock){
            // 代码操作
        }
    }
}

public class Main{
    public static void main(String[] args){
        MyThread myThread = new MyThread();
        Thread thread1 = new Thread(myThread);
        Thread thread2 = new Thread(myThread);
        thread1.start();
        thread2.start();
    }
}
  1. 待機状態を使用してスレッド間のコラボレーションを実現します:
    スレッド間のコラボレーションを実現するには、あるスレッド内で他のスレッドを待機する必要があります。通知を受け取った後もスレッドの実行は続行されます。このとき、待機状態を使用してスレッド間の連携を実現できます。

コード例:

public class MyThread implements Runnable{
    public void run(){
        synchronized(lock){
            try{
                lock.wait(); // 等待其他线程的通知
            }catch(InterruptedException e){
                e.printStackTrace();
            }
            
            // 继续执行
        }
    }
}

public class Main{
    public static void main(String[] args){
        MyThread myThread = new MyThread();
        Thread thread = new Thread(myThread);
        thread.start();
        
        // 唤醒等待的线程
        synchronized (lock){
            lock.notify();
        }
    }
}
  1. 時間指定待機状態を使用してスケジュールされたタスクを実装する:
    一部のシナリオでは、特定のタスクを定期的に実行する必要があります。現時点では、 Timed Waiting 状態を使用して、スケジュールされた実行を実装できます。

コード例:

public class MyThread implements Runnable{
    public void run(){
        try{
            Thread.sleep(2000); // 等待2秒钟
        }catch(InterruptedException e){
            e.printStackTrace();
        }
        
        // 执行定时任务
    }
}

public class Main{
    public static void main(String[] args){
        MyThread myThread = new MyThread();
        Thread thread = new Thread(myThread);
        thread.start();
    }
}

概要:
この記事では、Java スレッド状態変換の原理とアプリケーション シナリオを紹介することで、Java スレッド状態変換プロセスを詳細に説明します。対応するコード例が提供されます。スレッド状態遷移の原理と応用シナリオを理解することは、マルチスレッド プログラミングにとって非常に重要です。この記事が読者のお役に立てば幸いです。

以上がJava スレッド状態変更のメカニズムと適用範囲についての詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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