「Javaのマルチスレッドプログラミングの実用的なガイド(コア論文)」読書ノート
1マルチスレッドの概念
1.1プロセス、スレッド
- プロセス
- (メモリやファイルハンドルなど)オペレーティング・システムへのアプリケーションプログラムの資源の基本単位
- スレッド
- プロセスとは独立して行うことができる最小単位
このプロセスは複数のスレッドが、そのようなので、上のメモリ空間、ファイルハンドルやなどのプロセス内のすべてのスレッドとプロセスのリソースを共有含めることができます。
1.2 Javaスレッドの作成
Javaプラットフォームでスレッドを作成するスレッドクラス(またはそのサブクラス)のインスタンスを作成し、実行中のスレッドは、実際には、Java仮想マシンは、その実行方法を実行する、対応するタスク処理ロジックコードが実行される、スレッドクラスを開始しますアクションの方法は、適切なスレッドを開始することです。
対応するスレッドがすでに実行の終わりを意味しないメソッドの呼び出しを開始し、実行する可能性がある。このスレッドは以降のみだった、とさえ実行されない可能性があります。スレッド開始の本質は、対応するJava仮想マシンの実行中のスレッドを要求することで、スレッドスケジューラによって決定される実行するために正確にいつこのスレッドであるため(スケジューラ)があります。
- Javaスレッドの作成
- ある共通の構造の2つのクラスをスレッド:スレッドとスレッド(Runnableを対象)、抽象糸を通し、Runnableを、タスクの抽象化として見ることができます。
新しい新しい スレッド(){ @Override 公共 ボイド RUN(){ // タスクを実行 } }; 新しい新しいスレッドを(新しい新しいRunnableを(){ @Override 公共ボイドRUN(){ // タスクを実行 } })。
- スレッドを再利用することはできません
- スレッドは「ワンタイム項目、」我々は、再起動方法は、それを再度実行するために、すでに実行中のスレッドの終わりと呼ばれることができません。実際には、スレッドのインスタンスと同じ方法を開始するための複数の呼び出しは、それがないIllegalThreadStateException例外をスローすることがあります。
- メモリの割り当て
- まず、Javaで、スレッドがオブジェクトを作成するために必要なメモリ領域を割り当て、オブジェクトです。Javaは差が各スレッドに割り当てられた、Java仮想マシン呼び出しスタック(コールスタック)に必要なメモリ空間であるオブジェクトのおよび他のタイプを作成します。コールコールトラッキング方式のスタック、およびJavaコードの間の関係は、ネイティブコード(ネイティブコード、通常はCコード)を呼び出します。また、Javaプラットフォームは、各スレッドが対応するカーネル・スレッド(Java仮想マシンに関連の特定および実装)があってもよいです。だから、相対的に言って、スレッドオブジェクトを作成することは、コストの数を作成するために、オブジェクトの他のタイプよりも高くなっています。
- 実行と現在のスレッドのスレッド
- (このような方法のような)コードのどの部分でJavaは、スレッドはそれに応じて、このコードの実行のスレッドと呼ばれる常に実行スレッドを決定する責任があり、コードのどの部分がにThread.currentThreadを呼び出すことによって得ることができます()このコードの実行のスレッドは、このスレッドは現在のスレッドと呼ばれています。
1.3スレッド(スレッド)のプロパティ
プロパティは、スレッドのスレッド番号(ID)、名前(名)、スレッドのカテゴリ(デーモン)と優先度(優先度)があります。
プロパティ | タイプ | 使用 | リードオンリー | 説明 |
番号(ID) |
長いです |
異なるスレッドを識別するために使用し、別のスレッドが持って 異なる番号を |
それはあります |
実行中のスレッドの特定の番号の後、スレッドの数は、その後の使用を作成することができます。別のスレッドは、 番号が異なる所有しているが、この数の一意のJava仮想マシンで唯一の実行 効率。これは、いくつかのスレッドには番号が付けすることができる(例えば、Webサーバの再起動など)は、Java仮想マシンを再起動し 、Java仮想マシンを実行中のスレッドの最後の数と同じなので、このプロパティの値は適していない 一意の識別子のいくつかの種類特に、データベース内の一意の識別子(例えば、主キー)として |
名前 (名) |
弦 |
異なるスレッドを区別するために、スレッドのデフォルト値 フォーマットデフォルト値に関連するIDである「スレッド スレッド番号」は、「スレッド0」として |
ノー |
Javaは同じ値の別のスレッドに私たちのプロパティの名前を禁止していない、しかし、セット セットスレッド名とコードのデバッグプロパティは、問題を見つけることができます |
スレッドのカテゴリ (デーモン) |
ブーリアン |
Tnue値は、デーモンスレッドとして対応するスレッドことを示し 、それ以外の場合は、対応するスレッドがユーザスレッドであることを意味します。属 スレッドの対応するスレッドと親金属のデフォルト値 と同じ値 |
ノー |
プロパティには、対応するスレッドが開始される前に設定されている必要があり、それはは、setdaemonメソッドの呼び出しである上にある必要があり 、startメソッドが呼び出される前に、そうでない場合は、setdaemon方法は投げ ないIllegalThreadStateException例外を。不適切な設定は、ミッションクリティカルな処理スレッドの数を担当する スレッドをデーモンに設定されています |
最適化レベル (優先順位) |
int型 |
財産の性質上のスレッドスケジューラに提示され、 スレッドが優れ期待できるアプリケーションを示すために使用されて 最初に実行することを。Javaは、好ましくは1つの、10〜10を規定 優先、デフォルト値は、一般的に5(通常の優先順位を示しています )。特定のスレッドのために、その優先順位 デフォルトと親スレッドのレベル(スレッド作成 スレッドを)優先度の値は等しいです。 |
ノー |
一般的に、適切に深刻な問題を引き起こす可能性があり、プロパティ値を設定することはできませんデフォルトの優先度を使用します(スレッド 飢餓) |
- スレッドプロパティを使用します
- スレッド番号の特性に加えて、他の、すなわち、スレッドクラスは読み取り又は適切なプロパティを設定するための取得および設定メソッドを提供する、読み書き可能な属性の特性です。
。にThread.currentThread()のgetName();
- 優先度の設定
- スケジューリングスレッドがスレッドスケジューラを実行しているどのような優先順位を決定するスレッドスケジューラにだけメッセージのJavaスレッドの優先順位属性の性質。これは、スレッドは、その優先度の順に実行されることを保証するものではありません。また、Javaスレッドの優先順位の誤用や乱用は(飢餓スレッド)スレッド空腹お金を産生する、いくつかのスレッドが実行するために取得することはありません可能性があります。したがって、スレッドの優先順位は、可能な限り高く設定されていません。あなたは、通常の状況下では通常の優先順位を使用することができ、それは優先順位属性のスレッドを設定する必要はありません。
- ユーザースレッドとデーモンスレッド
- Java仮想マシンのスレッドが通常の停止を防ぐかどうかに応じて、私たちすることができますデーモンスレッド(デーモンスレッド)とユーザスレッド(非デーモンスレッドとして知られているユーザスレッド、)へのJavaスレッドインチ Java仮想マシン、終了して実行、通常のユーザスレッドの全ての場合にのみ停止しているJava仮想マシンを停止するには、通常のユーザー・スレッドを防ぎ、そしてデーモンスレッドがJava仮想マシンを停止し、通常には影響しません、つまりアプリケーションそこデーモンスレッドの実行は、通常の停止仮想マシンには影響しません。したがって、デーモンスレッドは、通常、他のスレッドの動作を監視するため、例えば、タスクのいくつかは非常に高い重要でない実行するために使用されます。