Javaの例 - スレッドの状態を取得します。
ライフサイクルのJavaスレッドは、5つの状態に分けることができます。
- 1.新しい状態(新規)を作成します。新しいスレッドオブジェクトを作成します。
- 2.準備状態(Runnableを):スレッドオブジェクトが作成された後、他のスレッドがオブジェクトのstart()メソッドを呼び出します。 プール内の実行可能スレッドが配置されているスレッドの状態は、CPUの使用権を獲得するために待機し、実行可能となっています。
- 3.実行ステータス(実行中):準備状態のスレッドは、プログラムコードを実行すると、CPUを取得します。
- ブロックされた4.(ブロック):スレッドがCPUを使用する権利を放棄するためにいくつかの理由でブロックされて一時的に実行を停止します。 準備完了状態にスレッド、実行して行く機会まで。 ケースは、次の3つのカテゴリをブロック:
- (A)、ブロックを待っている:実行待ちスレッドのrun()メソッドを、JVMは、待機プールにスレッドでしょう。
- (B)、同期ブロッキング:同期ロックが別のスレッドによって占有されている場合、同期ロックのオブジェクトを取得するには実行中のスレッドは、JVMは、スレッドプールにロックされます。
- (C)他のブロックされた:実行中のスレッドの実行スリープ()又は()メソッドへの参加、またはI / O要求を発行し、JVMは、スレッドがブロックされて設定されます。 ときにスリープ()タイムアウトは、(参加)スレッドが終了するかタイムアウトする、またはI / O処理が再びレディ状態に、スレッドを終了するのを待ちます。
- 5.死状態(デッド):上やランのうちの異常によるスレッドの実行()メソッド、ライフサイクルのスレッド終了。
次の例では、スレッドの状態を取得する方法を示しています。
/* author by w3cschool.cc Main.java */ class MyThread extends Thread{ boolean waiting= true; boolean ready= false; MyThread() { } public void run() { String thrdName = Thread.currentThread().getName(); System.out.println(thrdName + " 启动"); while(waiting) System.out.println("等待:"+waiting); System.out.println("等待..."); startWait(); try { Thread.sleep(1000); } catch(Exception exc) { System.out.println(thrdName + " 中断。"); } System.out.println(thrdName + " 结束。"); } synchronized void startWait() { try { while(!ready) wait(); } catch(InterruptedException exc) { System.out.println("wait() 中断。"); } } synchronized void notice() { ready = true; notify(); } } public class Main { public static void main(String args[]) throws Exception{ MyThread thrd = new MyThread(); thrd.setName("MyThread #1"); showThreadStatus(thrd); thrd.start(); Thread.sleep(50); showThreadStatus(thrd); thrd.waiting = false; Thread.sleep(50); showThreadStatus(thrd); thrd.notice(); Thread.sleep(50); showThreadStatus(thrd); while(thrd.isAlive()) System.out.println("alive"); showThreadStatus(thrd); } static void showThreadStatus(Thread thrd) { System.out.println(thrd.getName()+" 存活:" +thrd.isAlive()+" 状态:" + thrd.getState() ); } }
上記のコードは出力され実行されます。
…… alive alive alive MyThread #1 结束。 alive alive alive alive alive alive alive MyThread #1 存活:false 状态:TERMINATED