基本
スレッド状態
NEW、RUNNABLE、WAITINGは、TERMINATED、BLOCKED:Thread.Stateクラスの説明をよると、Javaスレッドは、6つの状態があります。
レディ状態(NEW):スレッドオブジェクトは、準備完了状態にスレッド後にstart()メソッドを呼び出します。レディキューで準備完了スレッドは、JVMのスレッドスケジューラをスケジュールする待っています。
動作状態(RUNNABLE):スレッドがCPUリソースの準備状態を取得する場合は、実行を行うことができます()、スレッドがこの時点で実行されます。最も複雑を実行中のスレッド、それがブロックされた状態、レディ状態、および死の状態になることができます。
ブロックされた:スレッドがスリープ(睡眠)を実行した後、待っていれば(待機中)および他の方法は、占有リソースの損失は、スレッドが実行されているからブロックされた状態になります。睡眠時間では機器やリソースがレディ状態を再入力することがあり得るようになってきました。これは3つのタイプに分けることができます:
- (WAITING)を遮断するのを待っている:実行スレッドが待ちの状態を実行している()、()、参加公園() メソッドを、スレッドが状態に入るのを待ってブロックされています。
- 同期ブロック(ブロック):(別のスレッド同期ロックが占有されているため)同期スレッド同期ロックの失敗を取得します。
- その他のブロッキング(TiMED_WAITHIN):発行されたI / O要求は、スレッドが呼び出し元のスレッドの睡眠を()ブロックすることにより、状態を入力するか、参加します()。睡眠()タイムアウト、参加()が終了するスレッドまたはタイムアウトを待つ、またはI / O処理、バック運転状態にスレッドを終了しました。
死状態(TERMINATED):スレッドは、状態の終了の状態を実行するタスクまたは他の終了条件が発生、スレッドスイッチを完了します。
これは、JVMのスレッドの状態について上記の状態は、オペレーティングシステムは、スレッドの状態を反応しないことは注目に値します。
スレッドの状態遷移図
スレッドの優先順位
各Javaスレッドは、オペレーティング・システムのスレッドスケジューリング順序を決定するのに役立ちます優先順位を持っています。スレッドの優先度は正の整数であり、デフォルトの優先度作成されたすべてのスレッドが5(Thread.NORM_PRIORITY)は、10(Thread.MAX_PRIORITY)の最大優先度に設定され、最小の優先度1(Thread.MIN_PRIORITY)。すべてのプロセッサリソースやその他のリソースのスレッドを待っていて、優先度の高いスレッドは、理論的には優先度スケジューリングする可能性が高いでしょう。
デーモンスレッド
デーモンスレッドが(それは、保護者であるオプションのスペアタイヤで、王女のための騎士)プロセスの実装でデーモンスレッドは、すぐに実行を終了するプロセス時にのみように、重要でないスレッドを意味します。
実行可能なクラスを作成します。
Threadクラスの継承
1.新しいクラスの継承Threadクラスを作成します。
2.オーバーライドrun()メソッド。メソッド本体のrun()メソッドは、スレッドがタスクを完了する必要が表しています。
3.スレッドのサブクラスのインスタンスを作成します。
4.スレッドを開始するスレッドオブジェクトのstart()メソッドを呼び出します。
パブリック クラスmyThread { 公共 静的 ボイドメイン(文字列[]引数){ スレッドt = 新しいnewThread()。 t.start(); } } クラス newThreadは拡張スレッド{ @Override 公共 のボイドの実行(){ System.out.printlnは(この .getName()+ ":!スタート" ); } }
Runnableを実装
1.新しいクラスは、Runnableインタフェースを実装して作成します。
2. runメソッドを書き換えます。メソッド本体のrun()メソッドは、スレッドがタスクを完了する必要が表しています。
3.ターゲットクラスの新しいインスタンスを作成します。
パラメータとしてターゲットに作成された4スレッドのインスタンス。
5.スレッドを開始するスレッドオブジェクトのstart()メソッドを呼び出します。
パブリック クラスmyThread { 公共 静的 ボイドメイン(文字列[]引数){ newThread NT = 新しいnewThread()。 スレッドt = 新しいスレッド(NT); t.start(); } } クラス newThreadは実装したRunnable { @Override 公共 のボイドの実行(){ System.out.printlnは(にThread.currentThread()のgetName()。 + ":!スタート" ); } }
両方の方法の利点
1.スレッドは使いやすく、この方法は、現在のスレッドオブジェクトへの容易なアクセスを継承しています。
2. Runnableを実装し、このアプローチは、他の親を継承することができ、複数のスレッドがリソースと同じような状況に対処するために複数のスレッドは、ターゲット・オブジェクトを共有することができます。
あなたは直接スレッドを開くためにrun()メソッドを呼び出すことができます
実際、この方法は意味)、唯一の実行に新しいスレッドでメソッド本体内のコードを()を実行するスレッドオブジェクトのstart()メソッドを呼び出して、直接呼び出しは(実行つまり、現在のスレッドでrun()メソッドを呼び出し、その実行()この方法では対処するなどの一般的な方法であり、新しいスレッドを作成しません。
パブリック クラスmyThread { 公共 静的 ボイドメイン(文字列[]引数){ newThread NT = 新しいnewThread()。 スレッドt = 新しいスレッド(NT、 "myThread" ); t.run(); } } クラス newThreadは実装のRunnable { @Override 公共 ボイドラン(){ System.out.printlnは( "名:" + 。にThread.currentThread()のgetName())。 } } // 结果 名:メイン
共通API
コンストラクタ
スレッド()、スレッド(文字列名 )//は文字列または何も渡さを渡すことができますが、作成することではありませんどのようなタスクをスレッド
スレッド(Runnableを対象)
スレッドの名前としてスレッド(Runnableをターゲット、文字列名)//オブジェクトが実行中で渡すことができ、名前
スレッド情報を入手
静的スレッドcurrentThread()//現在のスレッドオブジェクトを取得します。
長いのgetId()//スレッド識別を取得
文字列のgetName()が//スレッド名を取得します
int型getPriority()//スレッドの優先度を取得します
Thread.state getStateをは()//スレッドの状態を取得します
パブリック クラスmyThread { 公共 静的 ボイドメイン(文字列[]引数){ newThread NT = 新しいnewThread()。 スレッドt = 新しいスレッド(NT、 "myThread" ); t.start(); newThread.getInformation(にThread.currentThread())。 newThread.getInformation(T)。 } } クラス newThreadが実装Runnableを{ @Override 公共 ボイドラン(){ } 静的 ボイドgetInformation(スレッドt){ System.out.printlnは("名:" + t.getName()); System.out.println( "ID:" + t.getId())。 System.out.println( "優先順位:" + t.getPriority()); System.out.println( "状態:" + t.getState()); } } // 结果 名:メイン ID: 1 優先順位: 5 状態:RUNNABLE 名:myThread ID: 13 優先順位: 5 状態:TERMINATED
設定するスレッド情報
空のsetName()//スレッド名を設定します
スレッドの優先度を設定し、ボイドsetPriorityを()//
空は、setdaemon(ブールの)//、デーモンスレッドを設定するスレッドが呼び出す前に、start()メソッドの前に呼び出した場合にのみ、
スレッドの状態裁判官
ブールのisAlive()//スレッド死かどうかを判断します、
ブールisDaemon()//スレッドがデーモンスレッドであるかを決定
ブールisInterruptedを()//スレッドが中断されているかどうか、および非遮断状態にそれを回すために
パブリック クラスmyThread { 公共 静的 ボイドメイン(文字列[]引数){ newThread NT = 新しいnewThread()。 スレッドt = 新しいスレッド(NT、 "myThread" ); System.out.println( "未開始调用()时:" + t.isAlive()); t.setDaemon(真の); t.start(); newThread.getInformation(T)。 newThread.getInformation(にThread.currentThread())。 } } クラス newThreadは実装のRunnable { @Override 公共 ボイドラン(){ } 静的 ボイドgetInformation(スレッドt){ System.out.printlnは(t.getName() + " -のisAlive:" + t.isAlive())。 System.out.println(t.getName() + " - isDaemon:" + t.isDaemon()); System.out.println(t.getName() + " - isInterruptedを:" + t.isInterrupted()); } } // 结果 未调用(スタート)时:偽 myThread -isAlive:真 myThread -isDaemon:真 myThread -isInterrupted:偽 メイン -isAlive:真の メイン -isDaemon:偽 メイン -isInterrupted:偽
睡眠()メソッド
このアプローチは、いくつかの時間のために中断し、現在のスレッドを可能にします。
ミリ秒(ミリ秒)を一時停止します//静的な無効スリープ(ロングミリ秒)
ミリ秒(ミリ秒)+またはnanosナノ秒を一時停止//静的な無効スリープ(長いミリ秒、長いまたはnanos)
()メソッドに参加
呼び出されたときにtがチームに参加し、現在のスレッドの呼び出し元)あなたは、それは、t.joinの発生(それが現在のスレッドの仲間入りをすることであることを抽象的であることができ、参加するための手段に参加し、作業を開始する前に、トンのスレッドを待つ現在のスレッドを終了します。
パブリック クラスmyThread { 公共 静的 ボイドメイン(文字列[]引数)がスローInterruptedExceptionある{ newThread NT = 新しいnewThreadを(); スレッドt = 新しいスレッド(NT、 "サブスレッド" ); t.start(); t.join(); 以下のために(int型私は1 =;私は= 1000 <;私は++ ){ 場合(I%500 == 0 ){ System.out.printlnは( "mainThread仕上げ!" ); } } } } クラスnewThreadは実装したRunnable { @Override 公共 のボイドの実行(){ のために(int型 I = 1;私は= 1000 <;私は++は){ しようと{ のThread.sleepを( 5 ); } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } もし(I%500 == 0 ) のSystem.out.println( "サブスレッドフィニッシュ!" ); } } }
結果は次のように、メインスレッドは、サブスレッドの実行時間よりも明らかに短いが、それでもメインスレッドは、最終的に実行しています
サブスレッド仕上がり! サブスレッド仕上がり! 仕上がりをmainThread! 仕上がりをmainThread!
メソッドのオーバーロードの2つの形式があります。
ボイドが(長いミリ秒)//ミリ秒(ミリ秒)を待つ参加します
ボイドが(長いミリ秒、長いnanos値)//ミリ秒(ミリ秒)を待つ+のnanosナノ秒に参加します
達成するために()内部使用待ち()メソッドとのnotifyAll()メソッドに参加するので、スリープ状態からの()メソッドは、join()メソッドを保持しているロックを解放する一方、睡眠方法は、保持しているロックを解放しません、です異なります。
// t.join後()の代わりに(50,50)、異なる結果t.join: !mainThreadフィニッシュ MainThreadフィニッシュ! サブスレッドフィニッシュ! サブスレッドフィニッシュ!
収量()メソッド
方法に加えて、実行される優先度の高いスレッドレディキューで、この時間は、スレッドがロックを保持して解放しない、使用する権利の現在のスレッドカップをしてみましょう。