マルチスレッド
Javaプログラムを実行している場合、実際には、すでにそれは、スレッドがあり、それがメインスレッドです。
すべてのスレッドオブジェクトは、Threadクラスまたはサブクラスのインスタンスでなければなりません
-
Threadクラス、クラスおよびオーバーライドrun()メソッドのサブクラスの定義は、run()メソッドのメソッド本体は、run()メソッドが実行スレッドと呼ばれているので、タスクを完了するために、スレッドのニーズを表しています。
-
スレッドのサブクラスのインスタンスを作成し、スレッドオブジェクトが作成されます
-
スレッドを開始するスレッドオブジェクトのstart()メソッドを呼び出します
次のステップ:
-
実行可能なインターフェイス実装クラスが定義され、実行スレッドの同じスレッドのインタフェースとオーバーライドrun()メソッド、メソッド本体のrun()メソッド。
-
Runnableを実装クラスのインスタンスを作成し、ターゲットとしてスレッドThreadオブジェクトのインスタンスを作成するためにそれを使用し、Threadオブジェクトは本物だスレッドオブジェクト。
-
スレッドを開始するスレッドオブジェクトのstart()メソッドを呼び出します。
例:実装クラスのスレッドを定義//パブリッククラスMyRunnable実装Runnableを
MyRunnable MRは=新しいMyRunnable(); //スレッドオブジェクトを作成
スレッドTは、新しいスレッド(MR)= ; // 例としてThreadクラスを、スレッド開始
t.start();
スレッド実行の事実上すべてのマルチスレッドコードは、開始によるものである()メソッドを実行します。したがって、スレッドのクラスを継承または実装するかどうかを
ヒント:Runnableをのみ、対象Threadオブジェクトなどのオブジェクト、Runnableをクラス備えるが、実行の唯一のスレッドとしてrun()メソッドを実装します。実際のスレッドオブジェクトは、ちょうどこのスレッドのスレッドがそのターゲットの実行()のメソッドの実装を担当して、まだスレッドインスタンスです。
図1に示すように、単一継承制限継承、達成することができるよりも多くを達成する方法
2、異なる起動モード
3.継承:共有データを実装する際に静的である必要があるかもしれません
実装:長いRunnableを実装クラスのシェアと同じオブジェクトをすることができます。
4.継承:あなたはこのロックを選択し使用することはできません、
実装:あなたはこのロックを使用することができます選択します。
( "!新しいスレッド"){スレッド新しい新しい
@Override
ます。public void RUN(){
のために(int型I = 0; I <10; I ++){
System.out.printlnは(のgetName()+ ":!実行されています" + I);
}
}
} .start();
デーモンスレッドは、すべての非デーモンスレッドが死亡している場合、デーモンスレッドが自動的に殺されるという特徴を有しています。
コールは、setdaemon(true)メソッドは、デーモンスレッドとして指定されたスレッドを設定することができます。スレッドが開始される前に、それはそれ以外の場合はないIllegalThreadStateException例外が報告されます、設定する必要があります。
裁判官スレッドの安全性の問題
1、複数のスレッドがある場合
図3に示すように、これらのスレッドリードライトがあるかどうか、共有データを使用して
同期(シンクロック){
必要コード同期動作
}
同期ロックがオブジェクトである必要があります
複数のスレッドオブジェクトが使用する必要があります同じロックを。注:いずれかの時点で、最大で1つのスレッドがブロック上のロックに入った同期ロックを所有することができ、他のスレッドは外側だけ待つことができる(ブロック)。
] [同期他の修飾戻り型メソッド名(パラメータリストは、[])例外リストをスロー] [{
//コードは、スレッドの安全性の問題を生じさせることができます
}
ロックオブジェクトは、私たち自身で選択することができない、それがデフォルトです。
(1)静的メソッド:ロックオブジェクトは、現在のクラスのクラスのオブジェクトであります
(2)非静的な方法:本
ときに起こされるのを待って、待ちにフル、「プロデューサー」の必要性を「データがバッファ」。
「データバッファ」ときに起こされるのを待って、待ちに「消費者」の必要性を空にする。
-
-
通知:通知対象スレッドの待機セットがリリースに選択されています。
-
notifyAll:通知オブジェクト待ちセット上のすべてのスレッドが解放されます。
それは場所を中断していたので、通知し、直ちに実行スレッドを再開することができない可能性が目覚めた後のシンクブロックではありませんが、彼女は(おそらく他のスレッドに直面してロックを獲得するために、再試行してくださいする必要がありますので、現時点ではそれはもはや、ロックを保持しています競争が)、成功した後、元のコール待ちメソッドの後の場所で実行を再開することができます。
次のように要約:
-
あなたがロックを取得できた場合は、スレッドがWAITING状態からRUNNABLE(実行)状態になります。
-
そうでない場合は、待ち状態からのスレッドがブロックされてしまう(ロック待ち)状態
待機を呼び出し、通知方法は細部に注意を払うに必要
-
待って、通知方法の方法は、同じロックオブジェクトによって呼び出される必要があります。ので:対応するロックオブジェクトは、ロックオブジェクトでwaitメソッドの呼び出し後、スレッドの使用を通知復帰させることができます。
-
通知し、waitメソッドは、オブジェクトのクラスに属するメソッドです。ので:ロックオブジェクトは、任意のオブジェクトにすることができ、クラスに属する任意のオブジェクトは、Objectクラスを継承しています。
-
古典的な「生産者 - 消費者」問題を解決するためにウェイクアップ機構を待って
この問題を解決するために、我々は、バッファ内のプロデューサーのスレッドが待機をさせなければならない、ブロックされた状態に一時停止(待機)、フルである、通知(通知)スレッドが再開を待っているときに、バッファ内の次の消費者の消費データまで待ちます準備完了状態に、バッファへのデータの追加を開始。そして、その逆
まず、放置するスレッドの角度:5種類
1、新:スレッドオブジェクトを作成し、まだ開始
2、準備ができて:すでに開始し、CPUスケジューリングすることができ
3、実行:スケジュール設定されています
図4は、ブロック:会った:睡眠()、待機()、待機(時間)、他のスレッドは、(参加)、(時間)に参加、)(一時停止、ロックはなど、他のスレッドによって占有されています
5、死:通常、未処理の例外やエラー、停止(遭遇し、実行()は終了)
新しい状態プログラムのみ)の呼び出しは(開始スレッドができ、新たな非国家のスレッドとして開始されたスレッドやスレッドがスタートを呼び出して死亡した場合にのみ、一回呼び出すことができます()ないIllegalThreadStateException例外をエラーになります。
第二に、コードの6種類のスタンド角度
クラスで定義されているような列挙java.lang.Thread.State
パブリック列挙州{
NEW、
RUNNABLE、
BLOCKED、
WAITING、
TIMED_WAITING、
TERMINATED。
}
1、新NEW:スレッドオブジェクトを作成し、まだ開始
2、RUNNABLEを実行します:CPUは、スケジュールすることができ、または予定されています
3、ブロックされたBLOCKED:ロックを待機
図4に示すように、ウェイトWAITING:待機())、(参加)等(通知しなければならない等、全く設定された時間がない、または再開する糸の端栓
スリープ(時間)、待機(時間)、(時間)に参加し、その時間ブロッキングを持って、時間が回復するので、または割り込みが復元されます:5は、TIMED_WAITINGを待つ時間があります
同期ブロックに任意のスレッドは、同期方法の前に、あなたは、第1のモニタの同期のロックを取得しなければならないので、同期監視、それにロックを解放するとき?
1、ロックの解除操作
現在のスレッド同期方法、同期コードブロックの実行が終了します。
現在のスレッドが現在のスレッドの異常終了の結果、未処理のエラーまたは例外ブロック同期コード、同期プロセスが登場しました。
2、ロック操作を解放しません
线程执行同步代码块或同步方法时,程序调用Thread.sleep()、Thread.yield()方法暂停当前线程的执行。
线程执行同步代码块时,其他线程调用了该线程的suspend()方法将该线程挂起,该线程不会释放锁(同步监视器)。应尽量避免使用suspend()和resume()这样的过时来控制线程。
3、死锁
不同的线程分别锁住对方需要的同步监视器对象不释放,都在等待对方先放弃时就形成了线程的死锁。一旦出现死锁,整个程序既不会发生异常,也不会给出任何提示,只是所有线程处于阻塞状态,无法继续。