Javaにはいくつかのスレッド状態があります
Java には、初期 (NEW)、実行中 (RUNNABLE)、ブロック済み (BLOCKED)、待機中 (WAITING)、タイムアウト待機中 (TIMED_WAITING)、および終了済み (TERMINATED) の 6 つのスレッド状態があります。 new キーワードを使用して新しいスレッドを作成しますが、start() メソッドは呼び出されません。スレッドは新しい状態にあります。ブロックされた状態は、スレッドがモニター ロックを待機しており、その状態にトラップされていることを示します。待機状態に入ったスレッドは、他のスレッドが何らかの特定のアクション (通知または割り込み) を決定するまで待つ必要があります。
#このチュートリアルの動作環境: 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. スレッド状態図
2. 状態の詳細説明
Runnableインターフェースを実装し、Threadを継承するとスレッドクラスが取得でき、新しいインスタンスが出てくるとスレッドは初期状態になります。
2.1. 準備完了状態 (READY または RUNNABLE)- 準備完了状態は、実行する資格があることのみを意味します。あなたを選択すると、Always
- Ready
状態になります。
スレッドの start() メソッドを呼び出すと、スレッドは - ready
状態になります。
現在のスレッドの sleep() メソッドが終了し、他のスレッドの join() が終了し、ユーザー入力が完了するのを待ちます。スレッドがオブジェクト ロックを取得し、これらのスレッドも開始されます。 - 準備完了
状態。
現在のスレッドのタイム スライスが使い果たされ、現在のスレッドの yield() メソッドが呼び出され、現在のスレッドは - ready
状態になります。
ロック プール内のスレッドはオブジェクト ロックを取得した後、 - ready
状態に入ります。
スレッド スケジューラが実行可能プールから現在のスレッドとしてスレッドを選択すると、それが置かれている状態。これは、スレッドが実行状態に入る唯一の方法でもあります。
3. ブロック状態 (BLOCKED)ブロッキング状態は、同期されたメソッドによって変更されたメソッドまたはコード ブロックへの入力 (ロックの取得) をスレッドがブロックしたときの状態です。キーワード。
4. 待機中
(待機中)この状態のスレッドには CPU 実行時間が割り当てられません。明示的に起動されるまで待機する必要があり、そうでない場合は無期限に起動されます。待機状態。
5. タイムアウト待機
(TIMED_WAITING)この状態のスレッドには CPU 実行時間が割り当てられませんが、明示的にウェイクアップされるまで無期限に待機する必要はありません他のスレッドによって、一定時間が経過すると自動的に起動します。
6. 終了ステータス (TERMINATED)- #スレッドの run() メソッドが完了したとき、または main() メソッドが完了したときメインスレッドのスレッドが完了すると、終了したものとみなされます。このスレッド オブジェクトは生きている可能性がありますが、個別に実行されるスレッドではなくなります。スレッドが終了すると、復活することはできません。
- 終了したスレッドで start() メソッドを呼び出すと、java.lang.IllegalThreadStateException 例外がスローされます。
- 3. 待機キュー
- #待機キューに関連する手順と図
##スレッド 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 サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

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

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

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

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

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

ホットトピック

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

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

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

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

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