最後の章では、スレッドのいくつかの基本的な知識、スレッドの作成と終了を紹介します。この問題は、スレッドと一般的な方法あなたのライフサイクルをもたらすでしょう。私はより多くのJava関連の知識を習得するために公共の「サイドJavaコード」の数が心配です。
ライフサイクルスレッド
スレッドが作成されていないが、すぐに実行するために始めた、またそれは、状態の実行中になっています。スレッドのライフサイクル全体を通じて経験するであろう新しい(新規)、
レディ(Runnableを)は、実行中の(実行)、ブロックされた(ブロック)と破壊する 5つの状態(終端)。
新しいです
これは、スレッドが新しい状態になった後、新たなキーワードを使用して、新しいスレッドオブジェクトを作成することをいいます。この時点で、その唯一のJVMによってメモリを割り当て、そのメンバ変数の値を初期化します。
レディ
スレッドオブジェクトは、start()メソッドをコールするときに、スレッドが準備完了状態にあります。JVMの呼び出しスタックとプログラムカウンタを実行するようにスケジュールされるのを待って、メソッドを作成します。
ラン
スレッドがCPUクロックで準備完了状態にある場合に実行スレッド、開始run()メソッド、スレッドが実行されています。
おもり
何らかの理由でスレッドが一時的に実行を停止するためにCPUを使用する権利を放棄した状態手段を遮断します。三つのカテゴリーの閉塞の場合:
- 待機中のブロック(o.wait->待ち列):実行ラン(ランニング)()メソッドのo.waitスレッドは、JVMは、待ちキュー(待ち行列をwaitting)に通すだろう。と
- 同期遮断(ロックイン>ロックプール):スレッド実行(実行)同期ロックオブジェクトを取得する際、同期ロックが別のスレッドによって占有されている場合、JVMは、スレッドプール(ロックプール)にロックされます。
- 他のブロッキング(SLEEP /参加):(ランニング)スレッドの実行のThread.sleep(長いミリ秒)またはt.join()メソッドを実行している、またはI / O要求を発行し、JVMは、スレッドを設定しますがブロックされています。睡眠()タイムアウトは、スレッドの参加()待ち時間が終了またはタイムアウトする、またはI / O処理が完了すると、スレッドが(Runnableを)状態に再実行することがあります。
破壊します
スレッドが終了するか、通常のスレッドが必須早期終了または異常なリードが最後になった後、スレッドは、リソースの解放を破壊される場合。
一般的な方法をスレッド
ライフサイクルのスレッドから、我々はいくつかの一般的に使用されるメソッドのスレッドを学びました。収量というように、そこに共通のメソッドスレッドの待機があり、通知、のnotifyAll、睡眠、参加します。
待つ
- 役割:のみ別のスレッドや割り込み通知を待つために、スレッドがWATING状態になり、スレッドを待つことを余儀なくが返されます。
- 注:待ち時間()メソッドを呼び出すと、オブジェクトがロックを解除します。したがって、一般的に同期コード同期方式またはブロックで使用される方法を待ちます。
睡眠
- 役割:のみ別のスレッドや割り込み通知を待つために、スレッドがTIMED_WATING状態になり、Nミリ秒のためにスリープ状態にスレッドを強制するが返されます。
- 注:待機と睡眠の異なる方法が現在ロック解除を占領されていません。
産出
- 役割:現在のスレッドがスライスが再び他のスレッドにCPU時間を競合し、CPUの実行時間スライスを生み出します。
- 注:通常の状況下では、優先度の高いスレッドが正常に競うCPUのタイムスライスを取得するためのより大きな尤度を持っているが、これは絶対的なものではなく、一部は、オペレーティングシステムのスレッドの優先度に敏感ではありません。
割り込み
- 役割:スレッド割り込み、その意図は、このスレッドに通知信号を与えることです、それはフラグ割り込み雌ねじに影響を与えます。
- 注意:
- 割り込みスレッドは、ブロッキング、終了状態に強制されることはありませんことを、スレッドの状態を変更しません。
- スレッドはTIMED-WATING状態である場合には、割り込み呼び出し()メソッドは、そのスレッドの早期終了TIMED-WATING状態という、InterruptedExceptionあるがスローされます。
- (などのThread.sleep(長い工場法)など)多くの宣言スローInterruptedExceptionある方法は、例外をスローする前に、割り込みフラグがクリアされているので、例外がスローされ、isInterruptedを()メソッドはfalseを返します呼び出します。
- あなたはthread.interrupt()メソッドを呼び出すことができ、内部スレッドrunメソッドが値に応じてスレッドを終了エレガントなことができます()のthread.isInterrupted。
加わります
- 役割:別のスレッドが終了するまでブロックされた状態に現在のスレッドは、現在のスレッドは、その後、準備完了状態に状態によって遮断されます。
- 使用シナリオ:メインスレッドプロモータースレッド、メインスレッドは、子スレッドのリターン・ステータスを待ちます。
System.out.println(Thread.currentThread().getName() + "线程运行开始!");
Thread6 thread1 = new Thread6();
thread1.setName("线程 B");
thread1.join();
System.out.println("这时 thread1 执行完毕之后才能执行主线程");
知らせます
アクション:通知Objectクラス()メソッドは、このオブジェクトで待機しているシングルスレッドウェイクモニター。
すべてのスレッドがこのオブジェクトで待機している場合は一つのスレッドを覚ますを選択され、選択は任意であり、スレッドの前に目を覚ます、待機を呼び出したスレッド()メソッドは、現在まで、オブジェクトのモニターで待機していますこの主題に放棄するスレッドをロックし、スレッドを覚醒され続けるためには、スレッドは、オブジェクトに同期させるために、競合する他のすべてのアクティブなスレッドと、従来の方法でウェイクアップします。同様の方法がまたのnotifyAll()は、このモニターで待機中のすべてのスレッドをウェイクアップします。
他のスレッド方法
- isAlive() :アライブスレッドかどうかを決定します。
- activeCount() :アクティブ・プログラム内のスレッドの数。
- 列挙() :スレッド列挙プログラム。
- currentThread() :現在のスレッドを取得します。
- isDaemon() :スレッドがデーモンスレッドであるか否かを判断します。
- setdaemon() :スレッドがデーモンスレッドで設定します。
- setName() :スレッドの名前を設定します。
- getPriority() :現在のスレッドの優先順位を取得します。
- setPriorityをは() :現在のスレッドの優先順位を設定します。
注意:线程优先级高,被CPU调度的概率大,但不代表一定会运行,还有小概率运行优先级低的线程。