あ 糸 Java では、常に次のいずれかの状態に存在できます。スレッドは、いかなる瞬間においても、示されている状態のいずれか 1 つにのみ存在します。
- 新しい状態
- 実行可能な状態
- ブロック状態
- 待機状態
- 時間指定された待機状態
- 終了状態
以下の図は、任意の瞬間におけるスレッドのさまざまな状態を表しています。

スレッドのライフサイクル
以下に示すように、ライフサイクルにはスレッドの複数の状態があります。
- 新しいスレッド: 新しいスレッドが作成されると、 新しい状態 。スレッドがこの状態にあるとき、スレッドはまだ実行を開始していません。スレッドが新しい状態にあるとき、そのコードはまだ実行されておらず、実行を開始していません。
- 実行可能な状態 : というスレッドです。 実行する準備ができています 実行可能な状態に移行します。この状態では、スレッドが実際に実行中であるか、いつでも実行できる状態になっている可能性があります。スレッドに実行時間を与えるのはスレッド スケジューラの責任です。マルチスレッド プログラムは、個々のスレッドに固定の時間を割り当てます。各スレッドの実行時間はわずかです。しばらく実行した後、スレッドは一時停止して CPU を放棄し、他のスレッドが実行できるようにします。
- ブロックされました: スレッドはブロック状態になります ロックを取得しようとしているとき しかし現在、ロックは他のスレッドによって取得されています。スレッドは、ロックを取得すると、ブロック状態から実行可能状態に移行します。
- 待機状態 : スレッドは待機状態になります。 wait() を呼び出すとき 方法または 参加する() 方法。他のスレッドが通知するか、そのスレッドが終了すると、実行可能状態に移行します。
- 時間制限付き待機 : スレッドは、次の場合に時間指定された待機状態になります。 タイムアウトパラメータを指定してメソッドを呼び出す 。スレッドは、タイムアウトが完了するか通知を受信するまで、この状態になります。たとえば、スレッドがスリープまたは条件付き待機を呼び出すと、スレッドは時間指定された待機状態に移行します。
- 終了状態: スレッドは、次のいずれかの理由で終了します。
- 普通に抜けるから。これは、スレッドのコードがプログラムによって完全に実行されたときに発生します。
- セグメンテーション違反やハンドルされない例外など、異常なエラー イベントが発生したためです。
Javaのスレッド状態
Java でスレッドの現在の状態を取得するには、次を使用します。 Thread.getState() スレッドの現在の状態を取得するメソッド。 Javaが提供する java.lang.Thread.State スレッドの状態の ENUM 定数を定義する enum の概要を以下に示します。
1. 新しい
まだ開始されていないスレッドのスレッド状態。
アンドロイド用imessageゲーム
public static Final Thread.State NEW
2. 実行可能
実行可能なスレッドのスレッド状態。実行可能状態のスレッドは Java 仮想マシンで実行されていますが、プロセッサなどのオペレーティング システムからの他のリソースを待っている可能性があります。
パブリック静的最終Thread.State RUNNABLE
3. ブロックされました
モニター・ロックを待ってブロックされたスレッドのスレッド状態。ブロック状態のスレッドは、モニター ロックが同期ブロック/メソッドに入るのを待っているか、呼び出し後に同期ブロック/メソッドに再入るのを待っています。 Object.wait()。
public static Final Thread.State BLOCKED
4. 待機中
待機中のスレッドのスレッド状態。次のいずれかのメソッドを呼び出したため、スレッドは待機状態になっています。
- タイムアウトなしの Object.wait
- スレッド.ジョイン タイムアウトなしで
- ロックサポート.パーク
public static Final Thread.State WAITING
5.時間制限付き待機
指定された待機時間を持つ待機スレッドのスレッド状態。スレッドは、指定された正の待機時間を使用して次のメソッドのいずれかを呼び出したため、時間指定待機状態になります。
Javaがmysqlに接続する
- スレッド.スリープ
- タイムアウト付きの Object.wait
- タイムアウト付きの Thread.join
- LockSupport.parkNanos
- LockSupport.parkUntil
パブリック静的最終Thread.State TIMED_WAITING
6. 終了
終了したスレッドのスレッド状態。スレッドの実行が完了しました。
public static Final Thread.State TERMINATED
スレッド状態のデモの例
以下は、さまざまなスレッド状態を示すチケット予約システムの実例です。
例:
Java// Java program to demonstrate thread states // using a ticket booking scenario class TicketBooking implements Runnable { @Override public void run() { try { // Timed waiting Thread.sleep(200); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println('State of bookingThread while mainThread is waiting: ' + TicketSystem.mainThread.getState()); try { // Another timed waiting Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } public class TicketSystem implements Runnable { public static Thread mainThread; public static TicketSystem ticketSystem; @Override public void run() { TicketBooking booking = new TicketBooking(); Thread bookingThread = new Thread(booking); System.out.println('State after creating bookingThread: ' + bookingThread.getState()); bookingThread.start(); System.out.println('State after starting bookingThread: ' + bookingThread.getState()); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println('State after sleeping bookingThread: ' + bookingThread.getState()); try { // Moves mainThread to waiting state bookingThread.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println('State after bookingThread finishes: ' + bookingThread.getState()); } public static void main(String[] args) { ticketSystem = new TicketSystem(); mainThread = new Thread(ticketSystem); System.out.println('State after creating mainThread: ' + mainThread.getState()); mainThread.start(); System.out.println('State after starting mainThread: ' + mainThread.getState()); } }
Gimp 背景を削除する
出力:
説明:
- 新しいスレッドが作成されると、スレッドは NEW 状態になります。 start() メソッドがスレッド上で呼び出されると、スレッド スケジューラはスレッドを Runnable 状態に移行します。
- スレッド インスタンスで join() メソッドが呼び出されるたびに、メイン スレッドは予約スレッドの完了を待機状態になります。
- スレッドの run メソッドが完了すると、その状態は Terminated になります。