ホームページ  >  記事  >  Java  >  Javaにはいくつかのスレッド状態があります

Javaにはいくつかのスレッド状態があります

青灯夜游
青灯夜游オリジナル
2022-11-24 16:03:0314346ブラウズ

Java には、初期 (NEW)、実行中 (RUNNABLE)、ブロック済み (BLOCKED)、待機中 (WAITING)、タイムアウト待機中 (TIMED_WAITING)、および終了済み (TERMINATED) の 6 つのスレッド状態があります。 new キーワードを使用して新しいスレッドを作成しますが、start() メソッドは呼び出されません。スレッドは新しい状態にあります。ブロックされた状態は、スレッドがモニター ロックを待機しており、その状態にトラップされていることを示します。待機状態に入ったスレッドは、他のスレッドが何らかの特定のアクション (通知または割り込み) を決定するまで待つ必要があります。

Javaにはいくつかのスレッド状態があります

#このチュートリアルの動作環境: Windows7 システム、Java8 バージョン、Dell G3 コンピューター。

Java のスレッドのステータスは 6: に分かれています。 1.

Initial (NEW)

: 新しいスレッド オブジェクトが作成されますが、start() メソッドはまだ呼び出されていません。 2. 実行 (RUNNABLE)
: Java スレッドでは、準備完了と実行中の 2 つの状態を一般に「実行中」と呼びます。 スレッド オブジェクトが作成された後、他のスレッド (メイン スレッドなど) がオブジェクトの start() メソッドを呼び出します。この状態のスレッドは、実行可能なスレッド プールに配置され、スレッド スケジューリングによって選択され、CPU の使用権を取得するのを待っており、この時点では準備完了状態になります。準備完了状態のスレッドは、CPU タイム スライスを取得した後に実行されます。 3.
ブロック済み (BLOCKED)
: スレッドがロック内でブロックされていることを示します。 4. Waiting(WAITING)
: この状態に入ったスレッドは、他のスレッドが特定のアクション (通知または中断) を行うのを待つ必要があります。 5. タイムアウト待機中 (TIMED_WAITING)
: この状態は WAITING とは異なり、指定された時間が経過すると自動的に戻ることができます。 6.
TERMINATED(TERMINATED): スレッドが実行を完了したことを示します。 これら 6 つの状態は、Thread クラスの State 列挙体で定義されており、1 対 1 に対応するソース コードを表示できます。

1. スレッド状態図

Javaにはいくつかのスレッド状態があります2. 状態の詳細説明

1. 初期状態 (NEW)

Runnableインターフェースを実装し、Threadを継承するとスレッドクラスが取得でき、新しいインスタンスが出てくるとスレッドは初期状態になります。

2.1. 準備完了状態 (READY または RUNNABLE)

    準備完了状態は、実行する資格があることのみを意味します。あなたを選択すると、Always
  • Ready

    状態になります。

  • スレッドの start() メソッドを呼び出すと、スレッドは
  • ready

    状態になります。

  • 現在のスレッドの sleep() メソッドが終了し、他のスレッドの join() が終了し、ユーザー入力が完了するのを待ちます。スレッドがオブジェクト ロックを取得し、これらのスレッドも開始されます。
  • 準備完了

    状態。

  • 現在のスレッドのタイム スライスが使い果たされ、現在のスレッドの yield() メソッドが呼び出され、現在のスレッドは
  • ready

    状態になります。

  • ロック プール内のスレッドはオブジェクト ロックを取得した後、
  • ready

    状態に入ります。

#2.2. 実行状態 (RUNNING of RUNNABLE)

スレッド スケジューラが実行可能プールから現在のスレッドとしてスレッドを選択すると、それが置かれている状態。これは、スレッドが実行状態に入る唯一の方法でもあります。

3. ブロック状態 (BLOCKED)

ブロッキング状態は、同期されたメソッドによって変更されたメソッドまたはコード ブロックへの入力 (ロックの取得) をスレッドがブロックしたときの状態です。キーワード。

4. 待機中

(待機中)

この状態のスレッドには CPU 実行時間が割り当てられません。明示的に起動されるまで待機する必要があり、そうでない場合は無期限に起動されます。待機状態。

5. タイムアウト待機

(TIMED_WAITING)

この状態のスレッドには CPU 実行時間が割り当てられませんが、明示的にウェイクアップされるまで無期限に待機する必要はありません他のスレッドによって、一定時間が経過すると自動的に起動します。

6. 終了ステータス (TERMINATED)

    #スレッドの run() メソッドが完了したとき、または main() メソッドが完了したときメインスレッドのスレッドが完了すると、終了したものとみなされます。このスレッド オブジェクトは生きている可能性がありますが、個別に実行されるスレッドではなくなります。スレッドが終了すると、復活することはできません。
  • 終了したスレッドで start() メソッドを呼び出すと、java.lang.IllegalThreadStateException 例外がスローされます。
  • 3. 待機キュー

obj の wait() メソッドと Notice() メソッドを呼び出す前に、obj ロックを取得する必要があります。コードセグメント内の synchronized(obj) に記述する必要があります。
    #待機キューに関連する手順と図

Javaにはいくつかのスレッド状態があります##スレッド 1 はオブジェクト A のロックを取得し、オブジェクト A を使用しています。

  • スレッド 1 は、オブジェクト A の wait() メソッドを呼び出します。

  • スレッド 1 はオブジェクト A のロックを解放し、すぐに待機キューに入ります。

  • ロック プール内のオブジェクトは、オブジェクト A のロックをめぐって競合します。

  • スレッド 5 はオブジェクト A のロックを取得し、同期ブロックに入り、オブジェクト A を使用します。

  • スレッド 5 は、オブジェクト A の NoticeAll() メソッドを呼び出し、すべてのスレッドをウェイクアップし、すべてのスレッドが同期キューに入ります。スレッド 5 がオブジェクト A の notify() メソッドを呼び出すと、スレッドが起動されますが、誰が起動されるかは不明で、起動されたスレッドは同期キューに入ります。

  • 同期された notificationAll() メソッドが終了し、スレッド 5 がオブジェクト A のロックを解放します。

  • 同期キュー内のスレッドはオブジェクト ロックをめぐって競合しますが、スレッド 1 がいつオブジェクト ロックを取得できるかは不明です。

  • 4. 同期キューのステータス

    • 現在のスレッドがオブジェクト A の同期メソッドを呼び出す必要があるときに、オブジェクト A のロックはロックされており、スレッドによって占有されているため、この時点で現在のスレッドが同期キューに入ります。つまり、同期キューは、オブジェクトのロックを競合しようとするスレッドでいっぱいになります。
    • スレッド 1 が別のスレッド 2 によって起動されると、スレッド 1 は 同期キュー に入り、オブジェクト ロックを競合します。
    • 同期キューは同期環境のみに存在する概念であり、1つのオブジェクトが同期キューに対応します。
    • スレッドの待機時間が経過するか、notify/notifyAll によってウェイクアップされると、スレッドは同期キューに入り、ロックを獲得すると競合します。ロックを獲得すると RUNNABLE 状態になり、そうでない場合は RUNNABLE 状態になります。 BLOCKED 状態になり、ロックが取得されるまで待機します。

    5. いくつかのメソッドの比較

    • Thread.sleep(long millis)、このメソッドは現在のスレッドによって呼び出される必要があります。現在のスレッドは TIMED_WAITING 状態に入りますが、オブジェクト ロックは解放されません。ミリ秒後、スレッドは自動的に起動し、準備完了状態になります。機能: 他のスレッドに実行の機会を与える最良の方法。

    • Thread.yield()、現在のスレッドはこのメソッドを呼び出す必要があります。現在のスレッドは、取得した CPU タイム スライスを放棄しますが、ロック リソースを解放せず、実行中のスレッドから変更します。 OS はスレッドを再度選択します。機能: 同じ優先度のスレッドを順番に実行しますが、順番に実行されるという保証はありません。実際には、譲歩スレッドはスレッド スケジューラによって再度選択される可能性があるため、yield() が譲歩の目的を達成するという保証はありません。 Thread.yield() はブロッキングを引き起こしません。このメソッドは、ユーザーが一時停止する時間を指定できないことを除いて、sleep() に似ています。

    • thread.join()/thread.join(long millis)、現在のスレッドは他のスレッド t の join メソッドを呼び出し、現在のスレッドは WAITING/# に入ります。 ##TIMED_WAITING 状態 、現在のスレッドはすでに保持されているオブジェクト ロックを解放しません。スレッド t が実行を完了するか、ミリ秒時間が経過すると、現在のスレッドは通常 RUNNABLE 状態になり、BLOCKED 状態になることもあります (結合は待機に基づいて実装されるため)。

    • obj.wait()、現在のスレッドはオブジェクトの wait() メソッドを呼び出し、現在のスレッドはオブジェクトのロックを解放し、待機キューに入ります。起動するには、notify()/notifyAll() を使用するか、タイムアウト時間が経過したときに自動的に起動するには wait(long timeout) を使用します。

    • obj.notify() は、このオブジェクト モニターを待機している単一のスレッドを起動します。選択は任意です。 NoticeAll() は、このオブジェクト モニターで待機しているすべてのスレッドを起動します。

    • LockSupport.park()/LockSupport.parkNanos(長いナノ)、LockSupport.park(長い期限)まで、現在のスレッドは WAITING/TIMED_WAITING 状態に入ります。 wait メソッドと比較して、スレッドはロックを取得せずに WAITING/TIMED_WAITING 状態に入る可能性があり、LockSupport.unpark (スレッド スレッド) を通じて目覚める必要があります。

    プログラミング関連の知識について詳しくは、

    プログラミング教育をご覧ください。 !

    以上がJavaにはいくつかのスレッド状態がありますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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