目次
Runnableインターフェースを実装し、Threadを継承するとスレッドクラスが取得でき、新しいインスタンスが出てくるとスレッドは初期状態になります。
4. 同期キューのステータス
5. いくつかのメソッドの比較
ホームページ Java &#&ベース Javaにはいくつかのスレッド状態があります

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

Nov 24, 2022 pm 04:03 PM
java

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 までご連絡ください。

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

    リアルなヌード写真を作成する AI 搭載アプリ

    AI Clothes Remover

    AI Clothes Remover

    写真から衣服を削除するオンライン AI ツール。

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    AI Hentai Generator

    AI Hentai Generator

    AIヘンタイを無料で生成します。

    ホットツール

    メモ帳++7.3.1

    メモ帳++7.3.1

    使いやすく無料のコードエディター

    SublimeText3 中国語版

    SublimeText3 中国語版

    中国語版、とても使いやすい

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境

    ドリームウィーバー CS6

    ドリームウィーバー CS6

    ビジュアル Web 開発ツール

    SublimeText3 Mac版

    SublimeText3 Mac版

    神レベルのコード編集ソフト(SublimeText3)

    Javaの平方根 Javaの平方根 Aug 30, 2024 pm 04:26 PM

    Java の平方根のガイド。ここでは、Java で平方根がどのように機能するかを、例とそのコード実装をそれぞれ示して説明します。

    Javaの完全数 Javaの完全数 Aug 30, 2024 pm 04:28 PM

    Java における完全数のガイド。ここでは、定義、Java で完全数を確認する方法、コード実装の例について説明します。

    Java の乱数ジェネレーター Java の乱数ジェネレーター Aug 30, 2024 pm 04:27 PM

    Java の乱数ジェネレーターのガイド。ここでは、Java の関数について例を挙げて説明し、2 つの異なるジェネレーターについて例を挙げて説明します。

    Javaのアームストロング数 Javaのアームストロング数 Aug 30, 2024 pm 04:26 PM

    Java のアームストロング番号に関するガイド。ここでは、Java でのアームストロング数の概要とコードの一部について説明します。

    ジャワのウェカ ジャワのウェカ Aug 30, 2024 pm 04:28 PM

    Java の Weka へのガイド。ここでは、weka java の概要、使い方、プラットフォームの種類、利点について例を交えて説明します。

    Javaのスミス番号 Javaのスミス番号 Aug 30, 2024 pm 04:28 PM

    Java のスミス番号のガイド。ここでは定義、Java でスミス番号を確認する方法について説明します。コード実装の例。

    Java Springのインタビューの質問 Java Springのインタビューの質問 Aug 30, 2024 pm 04:29 PM

    この記事では、Java Spring の面接で最もよく聞かれる質問とその詳細な回答をまとめました。面接を突破できるように。

    Java 8 Stream Foreachから休憩または戻ってきますか? Java 8 Stream Foreachから休憩または戻ってきますか? Feb 07, 2025 pm 12:09 PM

    Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

    See all articles