スレッドの使用は、より良いリソース利用率を改善するだけでなく、コードが不十分に設計されている場合、それが良いよりも害もあり、消費の消費コンテキストスイッチ、頻繁な切り替えカーネルモードとユーザーモードをもたらすために。
スレッドの
プロセスは、リソース割り当ての最小単位であり、スレッドは、プログラム実行の最小単位であり、スレッド、プロセス、プロセス・リソース・シェアリングを有する複数のスレッドを生成することができるプロセスに取り付けられています。
第二に、スレッドのライフサイクル(関連するAPI)
1、5段階の6つの状態
を5段階:新(新)、レディ(Runnableを)を、実行する(実行)は、(ブロック)と死(死)を遮断しました。
6つの状態:
パブリック 列挙州 { / ** *まだ開始されていないスレッドのスレッド状態。 * / 新しい、 / ** *実行可能なスレッドのスレッド状態。実行可能でスレッド *状態は、Java仮想マシンで実行されているが、それはかもしれません *オペレーティングシステムから他のリソースを待っていること *プロセッサなど。 * / RUNNABLE、 / ** *スレッドのスレッドの状態がモニターロックを待ってブロックされました。 *ブロックされた状態のスレッドは、モニターロックを待っています * synchronizedブロック/メソッドを入力しますか、 * synchronizedブロック/メソッド呼び出した後に再入力 * { @link オブジェクト#待ち()はObject.wait}。 * / BLOCKED、 / ** *待機中のスレッドのスレッド状態。 *スレッドが原因の一つを呼び出すのを待っている状態にあります ※以下の方法: * <UL> * <LI> { @link タイムアウトなしとオブジェクト#待ち()はObject.wait} </ LI> * <LI> { @link #join()Thread.join}タイムアウトなし</ LI>と * <LI> { @link LockSupport#パーク()LockSupport.park} </ LI> * </ UL> * * <P>待機状態のスレッドがへの別のスレッドを待っています *特定のアクションを実行します。 * *例えば、呼び出したスレッドの<tt>はObject.wait()</ TT> *オブジェクトの呼び出しに別のスレッドを待っています * <TT> Object.notify()</ TT>又は<TT> Object.notifyAll()</ TT>に *そのオブジェクト。<tt>をThread.join()</ tt>を呼び出したスレッド *が終了する、指定したスレッドを待っています。 * / WAITING、 / ** *指定された待機時間と待機しているスレッドのスレッド状態。 *スレッドが原因の一つを呼び出すタイミング待ち状態にあります *指定された正の待機時間と、次の方法が: * <UL> * <LI> { @link #sleepのThread.sleep} </ LI> * <LI> { @link タイムアウト付きオブジェクト#待ち(長い)はObject.wait} </ LI> * <LI> { @link #join(長い)Thread.join}とタイムアウト</ LI> * <LI> { @link LockSupport#parkNanos LockSupport.parkNanos} </ LI> * <LI> { @link LockSupport#parkUntil LockSupport.parkUntil} </ LI> * </ UL> * / TIMED_WAITING、 / ** *終了したスレッドのためのスレッドの状態。 *スレッドが実行を完了しました。 * / TERMINATED; }
1.1、新しい--new
新規および初期化。
4つの方法:
(1)継承Threadクラス
パッケージのテスト; パブリック クラス MyThreadは拡張スレッドを{ @オーバーライド 公共 のボイドの実行(){ System.out.println( "MyThreadが実行されています..." ); } } パッケージのテスト; パブリック クラスメイン{ 公共の 静的な 無効メイン(文字列[] args)を{ 新しい新 MyThread()スタート();. // ... MyThread作成し、実行中のスレッドを開始IS } }
(2)のRunnableを実装
パッケージのテスト; パブリック クラス MyThread 実装Runnableを{ @オーバーライド 公共 のボイドの実行(){ System.out.println( "MyThreadが実行されています..." ); } } パッケージのテスト; パブリック クラスメイン{ 公共 静的 ボイドメイン(文字列[]引数){ スレッドスレッド = 新しいスレッド(新しいMyThread()); thread.start(); // MyThreadは実行されている... // 或者新しいスレッド(新しいMyThread())(開始します)。 } }
(3)インタフェースを実装して呼び出し可能
(4)スレッドプールを使用
1.2準備--Runnable
後にスレッドオブジェクトがstart()メソッドを呼び出すようにすると、スレッドが準備完了状態にある、JVMは、割り当てCPUのタイムスライスへのシステムのための方法、待機を作成するために、スタックとプログラムカウンタを呼び出します。
:呼び出しは()メソッドとrun()メソッドは、以下の比較開始
(1)の呼び出しが開始()メソッドは、スレッドを開始するには、システムがハンドルに実行スレッドとして()メソッドを実行します。しかし、別のスレッドが同時に実行することはできません前に、直接オブジェクトを呼び出すスレッドのrun()メソッド、run()メソッドはすぐに、だけでなく、run()メソッドの戻りで実行される場合。換言すれば、通常のオブジェクトなどのシステム・スレッド・オブジェクト、およびrun()メソッドではなく、実行のスレッドよりも、一般的な方法ではない;
(2)スレッドのrun()メソッドを呼び出した後、スレッドが新しい状態でなくなりますスレッドオブジェクトの再スタート()メソッドをコールしないでください。新しい状態方法でスレッドにのみコール開始()、それ以外の場合はIllegaIThreadStateExccption例外につながります。
ランニング--Running 1.3
CPUのタイムスライスを取得するために実行スレッドのスレッドが実際に実行を開始することができた()メソッド
1.4は--Blockedブロックされた
CPUと、一時的にブロックされた状態にその実行を停止するように、いくつかのケースでは、実行中のスレッドを。
ブロックされたカテゴリー:
待機中のブロッキング:待ち()メソッドの状態を実行している実行スレッド、そのスレッドは障害物を待っている状態になっていること;
同期ブロック:(ロックが別のスレッドによって使用されているので)スレッドが同期ロックの失敗を同期します、それがに入ります同期ブロッキング状態;
他のブロッキング:睡眠によって、I / O要求()を呼び出すか、スレッドを(参加)、または発行され、スレッドがブロッキングステートに入ります。睡眠()タイムアウト、参加()または準備完了状態に終了、またはI / O処理のためのスレッドのタイムアウト待ちが完了すると、スレッドバック。
(1)WAITING:待ち状態の
スレッドは、再覚醒などの特別イベントを待って、無制限の待ち状態です。
通知()待機し()メソッドスレッドが待機またはのnotifyAll()メソッドを待って、
対象スレッドの実行待ち参加()メソッドを介してスレッドを待ってウェイクアップを超えています。
(2)TIMED_WAITING:時間待ちの状態
で実行し続ける準備ができて再スレッド(RUNNABLE)に3秒間待機した後、スリープ(3000):スレッドのような待機状態の時間制限に入ります。
1.5死--Deadの
スレッドの終了後に死亡した状態で、次の三つの方法で終了します:
(1)を実行()又は()メソッドの呼び出しが実行スレッドの、正常終了と、
(2)スレッドがキャッチされない例外をスローまたはエラー;
(3)スレッド停止()スレッド終了するメソッドを直接呼び出す-安全でない方法は、一般的に推奨されません。
終了(TERMINATED)状態、スレッドが終了すると、入力終了(TERMINATED)状態。
パッケージのテスト; パブリック クラスThreadTest { 公共 静的 ボイドメイン(文字列[]引数)がスローInterruptedExceptionあるが{ 実行可能interruptTask = 新しい実行可能(){ int型 I = 0 。 @オーバーライド 公共 無効RUN(){ 試み{ // タスクの通常の動作中に、このスレッドでは、多くの場合、割り込みフラグ、端末が停止する独自のスレッドに署名するように設定されている場合には しばらく時間が(!にThread.currentThread()。isInterruptedを()){ // 睡眠は、100ミリ秒 のThread.sleep(100 ); I ++ ; System.out.println(にThread.currentThread()のgetName() + "状态(" +にThread.currentThread()getStateを()+ ")ループ" +。I)。 } } キャッチ(InterruptedExceptionあるE){ // メソッドを呼び出すときに正しいInterruptedExceptionある例外処理はブロック。(例えば、スレッドの終了後に異常なキャッチ。) のSystem.out.println(にThread.currentThread()のgetName()+ "状態(" +。にThread.currentThread()getStateを() + ")キャッチInterruptedExceptionあります。" )。 } } }。 スレッドT1 = 新しいスレッド(interruptTask、 "T1" )。 System.out.println(t1.getName() + "状态( "+ t1.getState()+")に新しいです。" ); // "スレッドT1"開始 t1.startを(); System.out.println(t1.getName() + "状态( "+ t1.getState()+")が開始されます。" ); // スリープ300ミリ秒、命令「割り込み」を送信するためにメインスレッドT1にメインスレッド。 Thread.sleep(300 )。 t1.interrupt(); System.out.println(t1.getName() + "状态( "+ t1.getState()+")が遮断されます。" ); // メインスリープ300ミリ秒にスレッド、とt1の状態を表示します。 Thread.sleep(300 )。 System.out.println(t1.getName() + "状态( "+ t1.getState()+")は、今中断されました。" ); } }
結果:
T1状態(NEW)は、新たな新しいです。 T1状态(RUNNABLE)が開始されます。 T1状態(RUNNABLE)ループ 1 のT1状態(RUNNABLE)ループ 2 T1状态(TIMED_WAITING)が遮断されます。 T1状态(RUNNABLE)キャッチInterruptedExceptionあります。 t1は状态(TERMINATED)今中断されました。