Java におけるスレッドのライフサイクル

公開: 2023-01-27

目次

Java スレッドの基本:

Java のスレッドは、1 つのプロセス内での複数のアクティビティのパフォーマンスを容易にします。 これは、軽量プロセスと見なされます。 スレッドは、実行されたステートメントのシーケンスとして定義することもできます。 Java のすべてのスレッドには、独自のスタック、プログラム カウンター、およびローカル変数があります。 Java スレッドは、ネストされた一連のメソッド呼び出しである場合もあります。 メモリ、プロセスごとの状態、およびファイルは、スレッドによって共有されます。

Java でのスレッドの使用:

    • バックグラウンドまたは非同期処理を実行するには
    • GUI アプリケーションの感度を高めるには
    • マルチプロセッサ システムの良い面を実装するには
    • 複数存在する場合のプログラミングロジックの合理化

スレッドが呼び出されるとき、2 つの実行パスが存在します。 2 つのパスの 1 つはスレッドの実行に使用され、もう 1 つはスレッド呼び出しに続くステートメントを追跡します。 Java の各スレッドには、個別のメモリ空間とスタックがあります。

Java コードでスレッドを使用する際に発生するリスク要因は次のとおりです。

  • スレッドが共通変数にアクセスしてデータを一貫して表示する場合は、スレッド間の適切な調整が必要です。
  • プログラムでスレッドを過度に使用すると、スレッドのパフォーマンスと保守が困難になります。

Java におけるスレッドのライフサイクル:

プログラム実行の任意の時点で、Java のスレッドは以下のいずれかの状態で存在します。

  1. 新しい
  2. ブロックされた
  3. 実行可能
  4. 時限待機
  5. 待っている
  6. 終了しました

Java でのスレッドのライフ サイクルの詳細ビュー

新しいスレッド:

新しく作成されたスレッドの状態は「新規」です。 この状態では走行は進まない。 新しい状態でのスレッドのコードの実行はまだ行われていません。 まだ実行されていません。

実行可能な状態:

実行可能状態のスレッドは、実行する準備ができています。 この状態のスレッドは、いつでもすぐに実行できる状態であるか、すでに実行されている可能性があります。 スレッド スケジューラは、スレッドの実行時間を割り当てる役割を果たします。 マルチスレッド プログラムでは、個々のスレッドに特定の時間が割り当てられます。 個々のスレッドは短時間実行された後、一時停止します。 その後、CPU は別のスレッドに解放され、他のスレッドが実行される機会が提供されます。 この時点で、CPU を待機しているすべての実行準備完了スレッドと、現在実行中のスレッドは実行可能な状態にあります。

無料のテクノロジー コースをチェックして、競争で優位に立ちましょう。

人気のソフトウェア エンジニアリング コースを探す

LJMU & IIITB のコンピューター サイエンスの理学修士号 カリフォルニア工科大学 CTME サイバーセキュリティ証明書プログラム
フルスタック開発ブートキャンプ ブロックチェーンのPGプログラム
フルスタック開発のエグゼクティブ PG プログラム
以下のすべてのコースを表示
ソフトウェア工学コース

待機中/ブロック状態:

スレッドが一時的に動作していない場合、スレッドは次のいずれかの状態になります。

  • 待っている
  • ブロックされた

I/O の完了を待っているスレッドは、ブロックされた状態にあります。 スレッド スケジューラの機能は、ブロックされたスレッドまたは待機中のスレッドを再アクティブ化することにより、その実行をスケジュールすることです。 この状態のスレッドは、実行可能な状態に変換されるまで、それ以上実行を継続することはできません。 ブロックまたは待機状態のスレッドは、CPU サイクルを使用しません。

現在他のスレッドによって保護されているコードの保護セクションにスレッドがアクセスしようとすると、スレッドは強制的にブロックされます。 スケジューラは、セクションがすべてのスレッドに対してロック解除されると、保護されたセクションを待機しているスレッドの 1 つを実行可能な状態に変換します。 一方、スレッドは、特定の条件で他のスレッドを待機している間、待機状態に存在します。 待機状態のスレッドは、待機に指定された条件が満たされると、実行可能な状態にプッシュされます。 現在実行中のスレッドが待機/ブロック状態に移行した場合、スレッド スケジューラは実行可能なシーケンスから別のスレッドの実行をスケジュールします。

時限待機:

タイムアウト引数を指定してメソッドが呼び出されると、スレッドは時間指定された待機状態になります。 スレッドは、指定されたタイムアウトが完了するまで、または通知を受信するまで、この状態に留まり続けます。 たとえば、スレッドが条件付き待機またはスリープを呼び出すと、スレッドは時限待機状態に移行します。

終了状態:

スレッドの終了は、次のいずれかの理由で発生します。

  • スレッド内のコード セグメントの実行が完了したときのスレッドの通常の終了。
  • ハンドルされない例外やセグメンテーション違反などのまれなエラー イベントの発生。

終了状態のスレッドは、CPU サイクルを消費しません。

世界トップクラスの大学が提供するソフトウェア開発コースをオンラインで学びましょう。 エグゼクティブ PG プログラム、上級認定プログラム、または修士プログラムを取得して、キャリアを加速させましょう。

需要の高いソフトウェア開発スキル

JavaScriptコース コア Java コース データ構造コース
Node.js コース SQLコース フルスタック開発コース
NFTコース DevOps コース ビッグデータコース
React.js コース サイバーセキュリティコース クラウドコンピューティングコース
データベース設計コース パイソンコース 暗号通貨コース

Java でのスレッド状態の実装:

Java でスレッドの現在の状態を取得するには、Thread.getState() メソッドを使用します。 Java は、スレッドの状態の ENUM 定数が定義されている java.lang.Thread.State クラスも提供します。 詳細を以下の表にまとめます。

定数タイプ宣言説明
新しいpublic static final Thread.State NEW 作成されたばかりでまだ実行を開始していないスレッドのスレッド状態です。
実行可能public static final Thread.State RUNNABLE すでに実行中のスレッドまたは実行準備完了状態のスレッドの状態を表します。

同じスレッドが、Java 仮想マシンに対して実行可能な状態であり、プロセッサなどの他のオペレーティング システム リソースに対して待機状態である可能性があります。

ブロックされたpublic static final Thread.State BLOCKED これは、モニター ロックを待ってブロックされているスレッドの状態を表します。 監視ブロックが同期メソッド/ブロックに入るまで、または Object.wait() の呼び出し後に同期メソッドに再び入るまで、同じ状態のままです。
待っているpublic static final Thread.State WAITING 以下のいずれかのメソッドが呼び出されたために待機しているスレッドの状態を示します。

  1. タイムアウトなしの Object.wait
  2. LockSupport.park
  3. タイムアウトなしの Thread.join

待機状態は、別のスレッドによる特定のタスクの完了が原因である可能性があります。

時限待機public static final Thread.State TIMED_WAITING 指定時間待機しているスレッドの状態です。 次のメソッドのいずれかを呼び出すと、正の待機時間が割り当てられたスレッドの時間待機状態になります。

  1. タイムアウト付きの Thread.join
  2. タイムアウト付きの Object.wait
  3. LockSupport.partUntil
  4. LockSupport.parkNanos
終了しましたpublic static final Thread.State TERMINATED これは、その構成コード ステートメントの実行が完了したスレッドの状態です。

スレッドは、作成されたばかりの時点では NEW 状態にあります。 スレッドで .start() メソッドが呼び出されると、スレッドはスレッド スケジューラによって Runnable 状態に移行します。 スレッド インスタンスで join() メソッドが呼び出されると、現在コード ステートメントを実行しているスレッドは、このスレッドが終了するまで待機します。 そのため、コンソールに最後のステートメントを出力する前に、join() 関数がプログラムによってスレッド 2 で呼び出され、スレッド 2 が実行を完了して終了状態に移行するまで、スレッド 1 を待機状態に保ちます。 スレッド 1 はスレッド 2 の実行の完了を待っているため、WAITING 状態になります。

ソフトウェア開発に関連する人気記事を読む

Java でデータ抽象化を実装するには? Javaの内部クラスとは何ですか? Java 識別子: 定義、構文、および例
例を使用して OOPS のカプセル化を理解する C のコマンド ライン引数の説明 2022 年のクラウド コンピューティングの機能と特性トップ 10
Java のポリモーフィズム: 概念、型、特徴、および例 Java のパッケージとその使用方法 初心者向け Git チュートリアル: Git をゼロから学ぶ

Java プログラムでスレッドを使用するメリットと制限:

Java プログラムでスレッドを使用すると、次の利点があります。

  • コード開発時間の短縮
  • メンテナンス費用の削減
  • 複雑なアプリケーションのパフォーマンスの向上
  • ユーザー インターフェイスの応答性の向上
  • タスクの並列化
  • スレッドはサーバー アプリケーションで使用され、高いスループットとリソースの使用率を向上させます。
  • すべての CPU のコンピューティング リソースをスレッドで使用できない場合、別のスレッドを実行すると、これらのリソースが使用されたままになります。
  • 同じデータ セットが複数のスレッドで操作される場合、それらのキャッシュを共有できます。 これにより、キャッシュの使用やその値の調和が改善されます。

Java プログラムでスレッドを使用することには、いくつかの欠点があります。 それらのいくつかを以下に示します。

  • キャッシュ、トランスレーション ルックアサイド バッファー (TLB)、またはその他のハードウェア リソースを共有している間、複数のスレッドが互いに干渉する可能性があります。
  • 単一のスレッドのみが動作している場合でも、スレッドの実行時間は向上しません。 ただし、実行時間の低下は許容されます。 これは、追加のパイプライン ステージおよび/またはスレッド切り替えハードウェアの収容に必要な低速周波数が原因である可能性があります。
  • マルチスレッドでは、ハードウェア サポートがソフトウェアにさらされるため、マルチプロセッシングと比較して、オペレーティング システムとアプリケーション プログラムの両方で多くの変更が必要になります。

フルスタックのソフトウェア開発である Java について詳しく知りたい場合は、upGrad と IIIT-B のソフトウェア開発のエグゼクティブ PG プログラム – フルスタック開発のスペシャライゼーションをチェックしてください。 、9 つ以上のプロジェクトと割り当て、IIIT-B 同窓生のステータス、実践的な実践的な絶頂プロジェクト、トップ企業での仕事の支援。

この記事を共有したいですか?

将来のキャリアに備える

ソフトウェア工学の修士号に今すぐ申し込む