ホームページ  >  記事  >  スレッドのライフサイクルはいくつかの段階に分かれています

スレッドのライフサイクルはいくつかの段階に分かれています

青灯夜游
青灯夜游オリジナル
2023-02-21 16:24:4113300ブラウズ

5 段階: 1. New (新しいメソッドを使用して作成されたばかりのスレッド) 2. Ready (スレッドの start() メソッドを呼び出した後) この時点で、スレッドはCPU がリソースを割り当てるのを待っている段階にあります; 3. 実行中、準備ができたスレッドがスケジュールされて CPU リソースを取得すると、実行状態になります; 4. ブロッキング、実行中状態では、実行中状態のスレッドは何らかの理由でブロックされた場合; 5. 破棄 : スレッドが通常の実行を完了するか、スレッドが事前に強制終了されるか、例外が発生した後、スレッドは破棄されます。

スレッドのライフサイクルはいくつかの段階に分かれています

このチュートリアルの動作環境: Windows 7 システム、Dell G3 コンピューター。

スレッドのライフサイクルは、新規、準備完了、実行中、ブロック、破棄の 5 つの段階で構成されます。完全なライフ サイクル図は次のとおりです。

スレッドのライフサイクルはいくつかの段階に分かれています

スレッドが実行状態になると、一般的なオペレーティング システムはプリエンプティブな方法を使用して、スレッドが CPU を取得できるようにします。したがって、CPU は複数のスレッド間で切り替える必要があるため、スレッドのステータスは実行中、ブロック中、準備完了の間で複数回切り替わります。

1. 新しい (新しい)

##新しい : 新しい方法を使用すると、新しいものが生まれますout スレッドでは、現時点では、JAVA 仮想マシンのみがそれにメモリを割り当て、メンバー変数の値を初期化します。 現時点では単なるオブジェクトです。

2. Ready (実行可能)

Ready: と呼ばれます。スレッドの start() メソッドの後、スレッドは CPU がリソースを割り当てるのを待っている段階になります。最初に CPU リソースを取得した人が実行を開始します。 スレッドは準備完了状態になり、
JAVA 仮想マシンが実行されます。マシンは、そのマシンのメソッド呼び出しスタックとプログラム カウンタ を作成します。スレッドの実行は基盤となるプラットフォームによって制御され、ある程度のランダム性があります。

3. 実行中

##Running

: 準備完了スレッドがスケジュールされたとき CPU リソースが不足したときrun メソッドはスレッドの動作と機能を定義します (準備完了状態のスレッドが CPU を獲得すると、run() メソッドが実行されます) シングルコアの場合CPU (またはコア) は同時に 1 つの命令しか実行できませんが、JVM は命令を実行するスレッドを素早く切り替えることでマルチスレッドを実現します。実際のプロセッサは同時に 1 つの命令を処理できますが、この切り替え速度はは非常に高速であり、まったく実行しません。スレッド切り替え後に正しい実行位置を復元するために、各スレッドは独立したプログラムカウンタを持ち、各スレッド間のカウンタは互いに影響を与えずに独立して格納されます。 スレッドが実行を開始すると、スレッドが常に CPU を保持することはできません (スレッドの実行本体が非常に短く、実行が即座に終了する場合を除く)。したがって、他のスレッドが実行のために CPU にアクセスできるようにするには、スレッドの実行中に中断する必要があります。スレッド スケジューリングの詳細は、基盤となるプラットフォームで採用される戦略によって異なります。

4. ブロックされました ブロックされました: 実行状態では、何らかの理由で発生する可能性があります 実行中のスレッドブロックされてしまう。その理由は次のとおりです。

1.等待I/O流的输入输出
2.等待网络资源,即网速问题
3.调用sleep()方法,需要等sleep时间结束
4.调用wait()方法,需要调用notify()唤醒线程
5.其他线程执行join()方法,当前线程则会阻塞,需要等其他线程执行完。

状態切り替え図は次のとおりです。


スレッドのライフサイクルはいくつかの段階に分かれています

# #5. 破棄(終了)#スレッドが通常の実行を完了した場合、事前にスレッドが強制終了された場合、または例外が発生した場合、スレッドは破棄され、リソースが解放されます。

1. run()/call() メソッドが実行され、スレッドが正常に終了します;

2. スレッドがキャッチされなかった例外またはエラーをスローします;

3. スレッドの stop( ) メソッドを使用してスレッドを終了します。このメソッドはデッドロックを引き起こしやすいため、通常はお勧めできません。



拡張知識: CPU タイム スライス

オペレーティング システム レベルで水晶発振器が存在します。これは、僧侶が鐘を鳴らすのに少し似ています。数秒ごとにベルが鳴ります。衝突は短期間に 1 回発生し、CPU 時間をタイム スライスに分割します。各スレッドは実際にタイム スライスを 1 つずつ取得し続けます。タイム スライスがポイントに達した後も、再度取得する必要があります (すべてのスレッドが CPU を取得して独自のロジックを実行できるようにするため (公平性)

新しい状態

次のコード部分を見てみましょう:

Thread t1 = new Thread();

ここでの作成はJAVAというプログラミング言語レベルで作成されているだけで、オペレーティングシステムレベルでは実際のスレッドはまだ作成されていません。 start() メソッドを呼び出した場合にのみ、スレッドが作成され、Runnable 状態になります。 start() メソッドを呼び出した場合にのみ、スレッドが作成されます。

さらに関連する知識については、

FAQ

列を参照してください。

以上がスレッドのライフサイクルはいくつかの段階に分かれていますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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