Java スレッドの状態は何ですか?
Java スレッドの 5 つの状態: 1. 初期状態。 2. 実行可能状態。実行可能スレッド プール内にあり、CPU を使用する権利を取得するためにスレッド スケジューリングによって選択されるのを待っています。 3. 実行ステータス。 4. ブロック状態は、スレッドが何らかの理由で CPU の使用権を放棄したことを意味します。 5. 死亡状態では、死亡したスレッドを復活させることはできません。
Java のスレッドのライフサイクルは、大きく 5 つの状態に分類できます。
1. 初期状態 (NEW): 新しいスレッド オブジェクトが作成されます。
2. 実行可能 (RUNNABLE): スレッド オブジェクトが作成された後、他のスレッド (メイン スレッドなど) がオブジェクトの start() メソッドを呼び出します。この状態のスレッドは実行可能なスレッド プール内にあり、CPU を使用する権利を取得するためにスレッド スケジューリングによって選択されるのを待っています。
3. RUNNING: 実行可能状態のスレッドは、CPU タイム スライス (タイムスライス) を取得し、プログラム コードを実行します。
4. ブロック済み: ブロックされた状態は、スレッドが何らかの理由で CPU を使用する権利を放棄したこと、つまり、CPU タイムスライスを放棄し、実行を一時的に停止したことを意味します。スレッドが実行可能状態になるまで、CPU タイムスライスを再度取得して実行状態に移行する機会があります。ブロッキング状況には 3 つのタイプがあります:
(1). ブロッキングの待機中: 実行中のスレッドは o.wait() メソッドを実行し、JVM はスレッドを待機キュー (待機中) に入れます。キュー)真ん中。
(2) 同期ブロック: 実行中のスレッドがオブジェクトの同期ロックを取得するときに、その同期ロックが別のスレッドによって占有されている場合、JVM はそのスレッドをロック プールに入れます。
(3) その他のブロック: 実行中のスレッドが Thread.sleep(long ms) または t.join() メソッドを実行するか、I/O リクエストを発行すると、JVM はスレッドを is in に設定します。ブロッキング状態。 sleep() 状態がタイムアウトになるか、join() がスレッドの終了を待つかタイムアウトになるか、I/O 処理が完了すると、スレッドは実行可能状態に戻ります。
5. 死 (DEAD): スレッドの run() メソッドと main() メソッドの実行が終了するか、例外により run() メソッドが終了すると、スレッドはそのライフサイクルを終了します。 。死んだスレッドを復活させることはできません。
1. スレッド状態図
##2. 初期状態
実装実行可能インターフェイススレッドはスレッドクラスを取得することができ、新しいインスタンスが出てくるとスレッドは初期状態に入ります#3. 実行可能状態#1. 実行可能状態スケジューラーがあなたを選択しなかったとしても、いつでも実行可能です。
2. スレッドの start() メソッドを呼び出すと、スレッドは実行可能状態になります。
3. 現在のスレッドの sleep() メソッドが終了し、他のスレッドの join() メソッドが終了します。ユーザー入力が完了すると、スレッドがオブジェクト ロックを取得し、これらのスレッドも開始されます。実行可能な状態。
4. 現在のスレッドのタイム スライスが使い果たされると、現在のスレッドの yield() メソッドが呼び出され、現在のスレッドは実行可能状態になります。
5. ロック プール内のスレッドがオブジェクト ロックを取得すると、実行可能状態になります。
4. 実行状態スレッド スケジューラが実行可能プールから現在のスレッドとしてスレッドを選択したときのスレッドの状態。これは、スレッドが実行状態に入る唯一の方法でもあります。
5. 死亡状態1. スレッドの run() メソッドが完了するか、メイン スレッドの main() メソッドが完了すると、私たちはそれが死んだと考えます。このスレッド オブジェクトは生きている可能性がありますが、個別に実行されるスレッドではなくなります。スレッドが終了すると、復活することはできません。
2. デッドスレッドで start() メソッドを呼び出すと、java.lang.IllegalThreadStateException 例外がスローされます。
6. ブロッキング状態1. 現在のスレッド T が Thread.sleep() メソッドを呼び出し、現在のスレッドはブロッキング状態になります。
2. 現在のスレッドで実行されている他のスレッド t2 が join() メソッドを呼び出し、現在のスレッドはブロッキング状態になります。
3. ユーザー入力を待機しているとき、現在のスレッドはブロッキング状態になります。
7. 待機キュー (本来は Object のメソッドですが、スレッドに影響します)1. obj の wait() メソッドと Notice() メソッドを呼び出す前, obj ロックは取得する必要があります。つまり、synchronized(obj) コード セグメントに書き込む必要があります。
2. 待機キューに関連する手順と図
- スレッド 1 はオブジェクト A のロックを取得し、オブジェクト A を使用しています。
- スレッド 1 は、オブジェクト A の wait() メソッドを呼び出します。
- スレッド 1 はオブジェクト A のロックを解放し、すぐに待機キューに入ります。
- ロック プール内のオブジェクトは、オブジェクト A のロックをめぐって競合します。
- スレッド 5 はオブジェクト A のロックを取得し、同期ブロックに入り、オブジェクト A を使用します。
- スレッド 5 はオブジェクト A の NoticeAll() メソッドを呼び出し、すべてのスレッドをウェイクアップし、すべてのスレッドがロック プールに入ります。 ||||| スレッド 5 は、オブジェクト A の Notice() メソッドを呼び出してスレッドを起動します。誰が起動されるかは不明です。起動されたスレッドはロック プールに入ります。
- 同期された notificationAll() メソッドが終了し、スレッド 5 がオブジェクト A のロックを解放します。
-
ロック プール内のスレッドはオブジェクト ロックをめぐって競合しますが、スレッド 1 がいつオブジェクト ロックを取得できるかは不明です。 ||||| ステップ 6 で元のロック プールで目覚めたスレッドは、オブジェクト ロックをめぐって一緒に競合します。
#8. ロック プールのステータス
現在のスレッドは同期メソッドを呼び出したいと考えていますオブジェクト A のロックが別のスレッドによって占有されていることが判明したとき、現在のスレッドはロック プール状態に入ります。つまり、ロック プールは、オブジェクト ロックを競合しようとするスレッドでいっぱいになります。 スレッド 1 が別のスレッド 2 によって起動されると、スレッド 1 はロック プール状態に入り、オブジェクト ロックを競合します。 ロックプールは同期環境のみに存在する概念であり、1つのオブジェクトがロックプールに対応します。9. いくつかのメソッドの比較
Thread.sleep(long millis)、このメソッドは現在のスレッドによって呼び出される必要があります。現在のスレッドはブロッキングに入りますが、ブロッキングに入りません。オブジェクトを解放すると、ロックとミリ秒が経過した後、スレッドが自動的に起動し、実行可能な状態になります。機能: 他のスレッドに実行の機会を与える最良の方法。 Thread.yield()、このメソッドは現在のスレッドによって呼び出される必要があります。現在のスレッドは取得した CPU タイム スライスを放棄し、実行状態から実行可能状態に変更し、OS がもう一度スレッドを立てます。機能: 同じ優先度のスレッドを順番に実行しますが、順番に実行されるという保証はありません。実際には、譲歩スレッドはスレッド スケジューラによって再度選択される可能性があるため、yield() が譲歩の目的を達成するという保証はありません。 Thread.yield() はブロッキングを引き起こしません。 t.join()/t.join(long millis)、現在のスレッドは他のスレッド 1 の join メソッドを呼び出します。現在のスレッドはブロックされますが、スレッド 1 が実行を完了するまでオブジェクト ロックを解放しません。ミリ時間が経過すると、現在のスレッドは実行可能状態になります。 obj.wait()、現在のスレッドはオブジェクトの wait() メソッドを呼び出し、現在のスレッドはオブジェクトのロックを解放し、待機キューに入ります。自動的に起動するには、notify()/notifyAll() を使用して起動するか、待機 (長いタイムアウト) タイムアウトを使用します。 obj.notify() は、このオブジェクト モニターを待機している単一のスレッドを起動します。選択は任意です。 NoticeAll() は、このオブジェクト モニターで待機しているすべてのスレッドを起動します。 推奨チュートリアル:「java チュートリアル」
以上がJava スレッドの状態は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

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

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

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

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

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

ホットトピック









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

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

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

Java での日付までのタイムスタンプに関するガイド。ここでは、Java でタイムスタンプを日付に変換する方法とその概要について、例とともに説明します。

カプセルは3次元の幾何学的図形で、両端にシリンダーと半球で構成されています。カプセルの体積は、シリンダーの体積と両端に半球の体積を追加することで計算できます。このチュートリアルでは、さまざまな方法を使用して、Javaの特定のカプセルの体積を計算する方法について説明します。 カプセルボリュームフォーミュラ カプセルボリュームの式は次のとおりです。 カプセル体積=円筒形の体積2つの半球体積 で、 R:半球の半径。 H:シリンダーの高さ(半球を除く)。 例1 入力 RADIUS = 5ユニット 高さ= 10単位 出力 ボリューム= 1570.8立方ユニット 説明する 式を使用してボリュームを計算します。 ボリューム=π×R2×H(4

Java は、初心者と経験豊富な開発者の両方が学習できる人気のあるプログラミング言語です。このチュートリアルは基本的な概念から始まり、高度なトピックに進みます。 Java Development Kit をインストールしたら、簡単な「Hello, World!」プログラムを作成してプログラミングを練習できます。コードを理解したら、コマンド プロンプトを使用してプログラムをコンパイルして実行すると、コンソールに「Hello, World!」と出力されます。 Java の学習はプログラミングの旅の始まりであり、習熟が深まるにつれて、より複雑なアプリケーションを作成できるようになります。
