Java マルチスレッド原理分析: スレッド状態遷移とスレッド間通信
Java では、マルチスレッド プログラミングは並列コンピューティングを実現し、パフォーマンスを向上させる一般的な方法です。プログラムのパフォーマンス。マルチスレッド プログラミングでは、コンピューターのマルチコア機能を最大限に活用し、プログラムで複数のタスクを同時に実行できます。ただし、マルチスレッド プログラムを正しく作成し、その正確さとパフォーマンスを保証することは、比較的複雑な作業です。
この記事では、スレッドの状態遷移とスレッド間の通信に焦点を当てて、Java マルチスレッドの原理を分析します。これらの概念を説明するために、具体的なコード例が提供されています。
Java では、スレッドの状態は Thread クラスの State 列挙型によって表されます。一般的なスレッドの状態は次のとおりです。
1.1 New (新規): スレッド オブジェクトが作成されたが start() メソッドが呼び出されなかった場合、スレッドは新しい状態になります。
1.2 実行可能: start() メソッドを呼び出した後、スレッドは実行可能な状態になります。この状態のスレッドは、CPU スケジューリングの実行を待機している可能性があります。
1.3 ブロック中: スレッドは、リソースを待機しているか、何らかのブロック状況が発生したため、実行を一時停止する可能性があります。たとえば、スレッドが sleep() メソッドを呼び出したり、オブジェクトのロックを待機したりすると、スレッドはブロッキング状態になります。
1.4 待機中: スレッドは、Object クラスの wait() メソッドを呼び出すことによって待機状態に入ることができます。待機状態のスレッドは、実行を続行する前に、他のスレッドからの通知を待つ必要があります。たとえば、スレッドが特定の条件が満たされるのを待機する場合などです。
1.5 時間指定待機: 待機状態と似ていますが、タイムアウトがあります。スレッドは指定された時間待機でき、タイムアウトに達すると、スレッドは自動的に起動します。
1.6 終了: スレッドがタスクを完了するか異常終了すると、終了状態になります。
スレッドの状態遷移を次の図に示します。
| V New -> Runnable -> Blocked -> Runnable -> Terminated | ^ | V | | Waiting <- | | | V | Timed Waiting <---
次は、スレッドの状態遷移プロセスを示す簡単なサンプル コードです。
public class ThreadStateExample { public static void main(String[] args) throws Exception { Thread thread = new Thread(() -> { try { Thread.sleep(1000); // 线程进入Timed Waiting状态 synchronized (ThreadStateExample.class) { // 线程进入Blocked状态 ThreadStateExample.class.wait(); // 线程进入Waiting状态 } } catch (InterruptedException e) { e.printStackTrace(); } }); System.out.println("Thread state: " + thread.getState()); // NEW thread.start(); System.out.println("Thread state: " + thread.getState()); // RUNNABLE Thread.sleep(200); // 让线程有足够的时间进入Timed Waiting状态 System.out.println("Thread state: " + thread.getState()); // TIMED_WAITING Thread.sleep(1000); // 让线程有足够的时间进入Waiting状态 System.out.println("Thread state: " + thread.getState()); // WAITING synchronized (ThreadStateExample.class) { ThreadStateExample.class.notify(); // 唤醒线程 } Thread.sleep(200); System.out.println("Thread state: " + thread.getState()); // BLOCKED thread.join(); System.out.println("Thread state: " + thread.getState()); // TERMINATED } }
マルチスレッド プログラミングでは、スレッド間通信は重要なテクノロジです。スレッド間通信によりスレッド間の連携が実現され、スレッドが順序立ててタスクを実行できるようになります。
Java は、共有メモリ、待機/通知メカニズム、セマフォ、モニターなどを含む豊富なスレッド間通信メソッドを提供します。その中で最も一般的な方法は、共有オブジェクトを通じてスレッド間通信を実現することです。
共有オブジェクトは通常、複数のスレッドからアクセスできるオブジェクトです。スレッド間のデータ交換と共同作業は、共有オブジェクトの読み取りと書き込みによって実現できます。
以下は、スレッド間の通信方法を示す簡単なサンプル コードです。
public class ThreadCommunicationExample { static class SharedObject { private int value; private boolean isValueReady; public synchronized int getValue() { while (!isValueReady) { try { wait(); // 等待value准备好 } catch (InterruptedException e) { e.printStackTrace(); } } return value; } public synchronized void setValue(int value) { this.value = value; isValueReady = true; // 设置value准备好的标记 notify(); // 唤醒等待的线程 } } public static void main(String[] args) { SharedObject sharedObject = new SharedObject(); Thread readerThread = new Thread(() -> { int value = sharedObject.getValue(); System.out.println("The value is: " + value); }); Thread writerThread = new Thread(() -> { int value = 42; sharedObject.setValue(value); }); readerThread.start(); writerThread.start(); } }
上記のコードでは、スレッド間の通信は共有オブジェクト sharedObject## を通じて実現されています。 # コミュニケーション。 ReaderThread スレッドは、値を読み取る前に値の準備ができるまで待機し、writerThread スレッドは値の値を設定します。値の準備ができたら、readerThread スレッドが起動されて、値の値を読み取ります。
以上がJava マルチスレッドの詳細な分析: スレッドの状態遷移とスレッド間通信を理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。