この記事では、Java スレッドのライフ サイクルを (例とともに) 紹介します。これには一定の参考価値があります。必要な友人は参照できます。お役に立てば幸いです。
1. スレッドのライフ サイクル
プロセスには、スレッドと同様に特定のライフ サイクルがあり、スレッドのライフ サイクルには、作成状態、準備完了状態、ブロック状態、および終了状態の 4 つの状態が含まれます。
1. 作成状態
1) は、 new を使用してスレッド オブジェクトをインスタンス化することを指しますが、スレッド オブジェクトはまだ start() メソッドを使用してスレッドを開始していません。メモリ空間はヒープ内のオブジェクトのインスタンス変数に割り当てられますが、スレッドは CPU の使用権の獲得に参加できません;
2) スレッド オブジェクトが作成された後、 start() メソッドは、スレッド オブジェクトを開始するために使用されます。 run() メソッドではありません。
2. 準備完了状態
1) は、スレッド オブジェクトが start() メソッドを使用してから run() メソッドの実行を終了するまでの段階を指します。 Java 仮想マシン スレッドのメソッドのコール スタックとカウンタを作成します;
2) 特定の単位時間 (タイム スライス) 内で、CPU は 1 つのスレッドのみを実行できます。 CPU を使用する場合、このスレッドは実行状態とも呼ばれます。
3) 準備完了状態にあるすべてのスレッドはアクティブとみなされます。スレッドが準備完了状態であるかどうかをテストするには、isAlive() メソッドを使用できます。状態を取得し、activeCount() を使用して現在のスレッドが存在するスレッド プール内のアクティブなスレッドの数をクエリします。
4) 準備完了状態のスレッドは実行状態ではありません。 , 多くのコンピュータは単一プロセッサであり、準備完了状態にあるすべてのスレッドを同時に実行する必要があります。それは不可能です。Java は、いくつかのスケジューリング アルゴリズムを使用して、これらのスレッドがプロセッサの使用を共有するようにします (タイム スライス ローテーション アルゴリズムなど)。 、専用アルゴリズムなど)。
3. ブロッキング状態:
1) ブロッキング状態には 4 つの状態 (スリープ状態、ブロッキング状態、サスペンド状態、待機状態) が含まれます。準備完了状態は相互に切り替えることができます。
2) sleep() メソッドを使用してスレッドをスリープ状態にし、他のプロセスが実行できるようにします。ただし、sleep メソッドを使用すると、InterruptedExecption をキャプチャする必要があります。例外;
3) スレッドを一時停止するには、suspend メソッドを使用できます (jdk1.2 以降は廃止されました)。スレッドを待機状態にするには、wait メソッドを使用します (これについては後で説明します。 )、I/O 割り込みを使用してスレッドをブロッキング状態にします。
4. 停止状態:
1) スレッドが run メソッドの実行を終了すると、スレッドは停止状態になり、Java 仮想マシンはスレッド オブジェクトによって占有されていたシステム リソースを破棄します。死亡状態;
2) 実行中にスレッドがキャッチされなかった例外に遭遇すると、スレッドは終了され、死亡状態になります。stop メソッドを呼び出すとスレッドが死亡状態になることもありますが、デッドロックを引き起こしやすいため、非推奨になりました。
5. スレッドのライフサイクルは次のとおりです:
2. 以下は、sleep メソッドがスレッドをスリープ状態にします
/** * @author: PrincessHug * @date: 2019/4/12, 9:20 * @Blog: https://www.cnblogs.com/HelloBigTable/ */ public class SleepDemo implements Runnable{ @Override public void run() { long l; for (int i=1;i<6;i++){ l = System.currentTimeMillis(); try { Thread.currentThread().sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } l = (System.currentTimeMillis() - l); System.out.println(Thread.currentThread().getName() + "线程执行了" + i + "次,耗时" + l + "毫秒。"); } } } public class SleepDriver { public static void main(String[] args) { SleepDemo sd = new SleepDemo(); for (int i=0;i<50;i++){ new Thread(sd,i + "#").start(); } } }
以下は、実行結果のスクリーンショットの一部です:
##同時に、開始されるスレッドの数が増えるほど、各スレッドにかかる時間が長くなります。
以上がJava スレッドのライフサイクルの概要 (例付き)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。