まず、基本的な概念
プロセス(プロセス):プログラムの実行中のインスタンス。ビデオおよび対応するビデオファイルの再生率のようなプロセスおよび手順の間の関係。プロセスは、(例えば、メモリ、ファイルハンドルなど)オペレーティング・システム・リソースの基本単位を適用するためのプログラムされています。
スレッド(スレッド):独立して実行可能な処理の最小単位。このプロセスは複数のスレッドがプロセス内のすべてのスレッドでのプロセスリソースを共有含めることができます。スレッドのJavaプラットフォームが対象です。
タスク(タスク):計算スレッドを達成することができます。
シリアル(連続):1により、完全な配列の1。
並行(同時):同じ期間が交互に完了します。
パラレル(並列):同じ時間が完了するまでに始めます。厳しい同時実行。
第二に、起動時のスレッドの実行を作成します
スレッドを作成するためのJavaが作成することでjava.lang.Thread
、クラスのインスタンスを。タスク処理論理スレッドであってもよく、Thread
クラスrun
の実装例のプロセス。むしろ、アプリケーションコードの呼び出しによってよりも、対応するスレッドを実行しているときには、仮想マシンによって直接呼び出されます。
Thread
クラスstart
アクションの方法は、対応するスレッドを開始することです。物質は、スレッドを実行している仮想マシンを、対応するスレッドを開始するための要求であり、このスレッドは、スレッドスケジューラ(スケジューラ)ので決定された正確にいつ実行することです。そのため、start
メソッド呼び出しは、スレッドの終了が既に実行されているという意味ではありません、このスレッドのかもしれないランは、後に、さらには実行されない場合がありました。
スレッドのrun
方法は、実行の対応するスレッドの終了を実行を終了しました。スレッドのstart
方法は、スレッド1回限りのアイテムを、あること、一度だけ呼び出すことができます。
//Thread两个常用构造器
public class Thread implements Runnable {
public Thread() {
init(null,null,"Thread-"+nextThreadNum(),0);
}
public Thread(Runnabletarget) {
init(null,target,"Thread-"+nextThreadNum(),0);
}
/**
* Initializes a Thread.
*
* @param g the Thread group
* @param target the object whose run() method gets called
* @param name the name of the new Thread
* @param stackSize the desired stack size for the new thread, or
* zero to indicate that this parameter is to be ignored.
* @param acc the AccessControlContext to inherit, or
* AccessController.getContext() if null
* @param inheritThreadLocals if {@code true}, inherit initial values for
* inheritable thread-locals from the constructing thread
*/
private void init(ThreadGroup g, Runnable target, String name,
long stackSize, AccessControlContext acc,
boolean inheritThreadLocals) {
//...
}
}
仮想マシンは、各スレッドのコールスタック(コールスタック)に必要なメモリ空間のために割り当てられた、Javaプラットフォームは、各スレッド高くなるようにオブジェクトの他のタイプよりも、スレッドオブジェクトの作成コストを作成するために、従って、対応するカーネル・スレッドが存在してもよいです一部。
第三に、スレッドのプロパティ
プロパティ | タイプ | 使用 | リマーク |
---|---|---|---|
ID番号 | 長いです | 異なるスレッドを識別します。 | 実行中のスレッドの特定の番号の後、スレッドの数は、その後の使用を作成することができます。一意の番号は1台ので実行するJava仮想マシンでのみ有効です。したがって、この属性の値は、いくつかのユニークな識別子(例えば、主キー)には適していません |
名前名前 | ストリング | 人々のために、異なるスレッドを区別するために属性。デフォルトはThread-ID |
デバッグスレッドのプロパティコードの名前を設定し、ヘルプ問題を特定 |
デーモンスレッドカテゴリ | ブーリアン | デーモンスレッドです。デフォルトでは、親スレッドと同じ | 対応するスレッドが開始される前にプロパティを設定する必要があります。デーモンスレッドを設定して、不適切なミッションクリティカルな処理スレッドを担当 |
優先順位優先順位 | int型 | Javaは10〜10の優先順位を定義します。デフォルト値は、一般的に5(通常の優先度)です。特定のスレッドのために、そのデフォルトの優先順位値は、親スレッドの優先順位の値に等しいです。 | 一般的にはデフォルトの優先順位を使用することができます。 |
Java仮想マシンのスレッドを防止するかどうか、通常の停止に応じて、私たちすることができますへのJavaスレッドでデーモンスレッド(DaemonThread)とユーザスレッド(非デーモンスレッドとして知られているUserThread、) 。
ユーザースレッドはつまり、Java仮想マシンだけで終了して実行、通常のユーザスレッドの全ての場合に停止することができる通常の停止Java仮想マシンを、防ぐことができます。
デーモンスレッドは、Java仮想マシン・アプリケーションを停止し、通常は影響を与えませんデーモンスレッドを実行しているJava仮想マシンを停止し、通常には影響しません。
したがって、デーモンスレッドは、通常のタスクのいくつかは、例えば、他のスレッドの動作を監視するため、非常に高い重要でない実行するために使用されます。
四、Threadクラス
方法 | 機能 | リマーク |
---|---|---|
static Thread currentThread() |
現在のスレッドを返します。 | |
void run() |
文字処理ロジックは、スレッドを実装します | アプリケーションは、一般的な呼び出してはいけません |
void start() |
対応するスレッドを起動します | それは一度だけ呼び出すことができます |
void join() |
対応するスレッドの実行の終了を待っています | AはB、呼び出しjoin メソッドAが動作Bの終了まで中断しました |
static void yield() |
現在のスレッドは、プロセッサの占領をあきらめ、現在のスレッドが中断される可能性があり | この方法は、信頼できるものではありません |
static void sleep(long millis) |
スリープ指定した時間 |
第五に、スレッドのライフサイクル
メインスレッド(メインスレッド)以来のJava仮想マシンは、エントリの方法実装を担当するJavaプログラム作成main
方法を。
親と子スレッドのスレッド間のライフサイクルは必ずしもリンクされていません。
- NEWは:スレッドが状態で作成された開始されていません。スレッドインスタンスは一度だけ活性化することができるので、スレッドがこの状態になると、これだけが存在することができます。
- RUNNABLE:この状態は、複合状態として見ることができます。READYとRUNNING:これは、2つのサブ状態を含んでいます。
READY状態は、スレッドは、スレッドスケジューラが行うことが可能であることを示すようにRUNNING状態におけるスケジューリング。アクティブなスレッドのため、この状態のスレッド。
状態を実行すると、すなわち、対応するスレッドオブジェクト、スレッドが実行されていることを示すrun
命令に対応する方法は、プロセッサによって実行されています。
- BLOCKED:スレッドを開始後、I / O(BlockingI / O)操作を阻止する、または(例えばロックのような)別のスレッドがリソースに保持された独占、この状態に対応するスレッドを適用します。この状態のスレッドは、プロセッサリソースを占有しません。
- WAITING:これは、特定のメソッドを実行するスレッドの後にいくつかの追加の特定の動作状態を実行するために他のスレッドを待っているになります。このような
Object.wait()
として:、Thread.join()
とLockSupport.park(Object)
。対応するスレッドはRUNNABLE適切な方法を含むのを待ってから変更することができる:Object.notify()/notifyAll()
およびLockSupport.unpark(Object))
。 - TIMED_WAITING:待ち状態と同様に、違いは、スレッドが無期限に特定の操作を実行するために別のスレッドを待たれていないこの状態にあるということですが、時間の制約と待機状態となります。特定の動作を行わないスレッドが指定された時間内で所望される他のスレッドは、スレッドの状態は自動的にRUNNABLEに変換されます。
- TERMINATED:糸の端はこの状態で行われています。スレッドは一度だけこの状態で持っていることがあります。
Thread.run()
正常復帰かによる早期終了に例外を投げるには、対応するスレッドになります。この状態になっています。
Shenkaoziliao:「Javaのマルチスレッドプログラミングの実用的なガイド(コア論文)」黄Wenhaiと