章Xのマルチスレッド

1.プログラムは、現実的な例が示す与えること?プロセスの違い、スレッドは何ですか。(オンライン情報、先生だと
同じではありません)


プログラム(プログラム):命令のセットです。プログラムは、システムがそれのためにリソースを割り当て、実行するためにメモリにロードされるように、独立して実行することはできません。
プロセス(プロセス):上述したように、プロセスと呼ばれるプログラムの実装。
プロセスがリソース割当システムの独立したユニットであり、各プロセスは特定のアドレススペースを占有します。
プログラムは、プロセスの静的なテキスト記述で、プロセスは、システム内の動的な活動プログラムのための実行です。
スレッド(スレッド):プロセス「コントロールの単一の連続流れ」。
CPUスレッドスケジューリングおよび割り当ては基本単位であるプロセスの基本的な単位はまた、軽量プロセスとして知られている、独立して実行することができるよりも小さいです。
スレッドが独立して存在することはできません、それはプロセスに接続する必要があります。プロセスは、並列複数のスレッドを含むことができ、1つのスレッド確かプロセスの一部です。Java仮想マシンは、アプリケーションが複数のスレッドを同時に実行することができます。

例:ワークショッププログラムがある場合は、現在進行中のタスクのワークショップの生産はプロセスであり、ワークショップに異なるジョブに従事する各ワーカースレッドです。


2. [機械]はどのように?コードの記述を使用したマルチスレッドのJavaクラスを作成します。そして、それを呼び出します。


スレッドを継承しています(1)カスタム・スレッド・クラス:
パブリッククラス{スレッドを拡張しMyDefinedThread
run()メソッドをオーバーライドし; //
ます。public voidラン(){
//置くスレッドがでrun()メソッドに記述されたタスクを実行する必要があります。
}

静的な無効メインパブリック(文字列[]引数){
MyDefinedThread MyDefinedThread新しい新しいMDT =();
mdt.start(); //スレッドを起動します。
}
}
、Runnableインタフェースを実装(2)カスタムクラス、
パブリッククラスMyRunnable実装が実行可能{
//実装run()メソッド;
公共ボイドラン(){
//スレッドが(ランで書かれたタスクを実行する必要がある)における方法;
}

静的な無効メインパブリック(文字列[]引数){
MRのMyRunnable新しい新しいMyRunnableは=();
//「氏の」スレッドオブジェクトではなく、コンストラクタスレッドへの引数として渡される、(MRの)TH =新しい新しいスレッドをスレッドで、「目には、」スレッドオブジェクトです。
th.start; //スレッドを起動します。
}
}


3.ThreadクラスはRunnableを実装していませんか?


それは実現しています。


4. startメソッドは、スレッドオブジェクトを呼び出されると、スレッドは、それを実行するために始めますか?


だけでなく、CPUのタイムスライスの割り当てを待って、準備ができて(動作可能)状態に入ります。CPUタイムスライス後、すなわち走行状態に入ります。

次のコードは、実際には、実行中の複数のスレッドがあります。


2:スレッドTとmain()メソッド(メインスレッド)。
静的な無効メインパブリック(文字列[] ARGC)例外がスロー{
Runnableを新しい新しい= R&LT Thread6を();
スレッドのスレッド新しい新しいT =(R&LT、 "名前テスト");
t.start();
}

約6話:睡眠の違いは、歩留まり、メソッドに参加します。


睡眠():スレッドがブロックされた状態に、指定された時間内に懸濁されます。
指定した時間が到着した後、準備完了状態。スレッドには、(オブジェクトを保持している場合は、その後、ロック)オブジェクトのロックを解除していない時にCPUを解放し、睡眠()メソッドを呼び出します。
参加する():このメソッドを呼び出すと、現在のスレッド待機中のスレッドを続行する前に終了します。例えば:、Tスレッド実行が完了しているような、メインメソッドは、この時点でブロックされた状態を入力すること、メインメソッドt.join()を呼び出すmainメソッドと続行する準備ができて、準備完了状態に戻ります。
収量():スレッドの一時停止と準備状態への復帰を呼び出すこの方法。だから、スレッドのメソッドを呼び出した直後に実行する準備状態に入る可能性があります。


7.なぜ止めの使用を推奨し、スレッドの最後まで実行方法を破壊しませんか?


停止():このメソッドは、実行中のスレッドを一時停止することを余儀なくまたは中断することができます。しかし、強制的ではなく、通常のシャットダウン手順よりも、コンピュータの電源を遮断するように、安全でない方法を止めます。これは、予期しない結果が生じることがあります。例:
あなたがスレッドオブジェクト()メソッドに停止を呼び出すと、スレッドオブジェクトのスレッドが即座に実行を停止し、専門のThreadDeath()例外がスローされます。ここで、「直ちに」すぎる「直ちに」、及び
スレッドが実行されている場合:
同期ボイド{
X = 3;
; Yが= 4。
}
メソッドが同期しているので、常にXを保証アクセスする複数のスレッドが、Yが同時に割り当てられていますスレッドは、X = 3に実行された場合と、偶数シンクブロックに、stop()メソッドによって呼び出されたとき、完全にそれを停止し、したがって不自由不完全なデータを作成します。最も基本的な条件でのマルチスレッドプログラミング私たちがした「スレッドを停止」と言うことができなかったので、そう、スレッドメソッドを停止することを忘れてください、データの整合性を確保します。

破壊():このメソッドは、最初にリリース任意のリソースなしでこのスレッドを破壊するように設計されました。これは、任意のモニターがロックされたままになります開催されました。しかし、この方法では実現することはありません。あなたが達成したい場合でも、また、モードがデッドロックである()一時停止する可能性が非常に高いです。ターゲットスレッドが破壊された場合、重要なシステムリソースを保護するためにロックを維持する、任意のスレッドは、いつでもこのリソースにアクセスすることができます。別のスレッドがこのリソースをロックしようとした場合、デッドロックが発生します。


[8]マシンコード命令を書き込むために、スレッドの典型的な実施形態が終了します。


run()メソッドを実行すると(1)、スレッドが自動的に終了されます。
(2)しかし、時々実行()メソッドは、(例えば、サーバー側のリスナー)終了、またはループを処理するために必要な他のタスクありません。この場合、そのようなwhileループなどの周期で、一般に、これらのタスク。あなたはループが永久に実行したい場合(真){...}に対処しながら、あなたが使用することができます。しかし、一定の条件の下で、whileループの終了を作るために、最も直接的な方法は、とwhileループを抜けるかどうかを制御するにはtrueまたはfalseにこのフラグを設定することによって、ブールフラグを設定することです。今例に挙げて説明します。

パブリッククラスThreadFlagはスレッド延び 

    公共揮発性ブール出口= FALSE; 

    RUN無効パブリック() 
    { 
        しばらく(出口!); 
    } 
    公共の静的な無効メイン(文字列[] args)をスロー例外 
    { 
        ThreadFlag新しい新しいスレッドThreadFlag =(); 
        Thread.start(); 
        SLEEP(5000); //遅延メインスレッド5秒 
        = trueのthread.exit; //スレッドにスレッド終了 
        Thread.joinを(); 
        System.out.printlnは( "スレッドの終了を!"); 
    } 

誘導灯出口の上記の定義のコードでは、出口がtrueの場合、ループを抜ける一方で、デフォルト値を終了falseです。終了を定義する場合、揮発性のJavaキーワードを使用して、このキーワードの目的は、出口を同期させることです、それは、同時にスレッド終了値によって修正することができます。


9.Aプライオリティスレッドは、B-優先度のスレッドはスケジューリングが呼び出すときに、1であり、10?


必ずしもそうではありません。スレッドの優先度が異なるスレッドスケジューラのための異なる意味を持っていること、ユーザーが直感的に推測できない場合があります。


[10]先生の教室の例を模倣する機械、お金を引き出すために、シミュレーションの操作コードのアカウントを完了します。


11.synchronize修飾法の前にそれが何を意味するのでしょうか?


1つのスレッドのみの方法、唯一の他のスレッドが入るように、この方法を行った後(スレッドが同期メソッドの内部にある)、行の現在のスレッドを待つために、この時点でメソッドを呼び出すために、別のスレッドに入ります。


以下のコードのように、修飾文ブロックを12.synchronize。実行しなければならないコードのブロックである
ロックオブジェクトアカウント。あなたが取得しない場合、何が起こるのだろうか?


あなたがロックアカウントオブジェクトを取得しない場合は、文ブロックを含む文の変更ブロックの実装を同期することはできません、オブジェクトが必要のこのアカウントをロック実行するために、他の同期ブロックと同期する方法があります。
同期(アカウント){
IF(account.money-drawingNum <0){
返します;
}
}

13. [マシン]デッドロックがどのように起因していますか?言葉で表現します。コード例を記述します。


過度のスレッドの同期はデッドロックが発生します。お互いに進めるためにロックを解除するために、両方のスレッドが待っている場合、時には膠着状態が存在します:2つのスレッドが他の側のニーズにロックを保持しており、2つのスレッドが動作を継続するために、ロックを解除するためにお互いを必要としています。例えば:

のは、このような生活の例を見てみましょう:川に架かる橋があり、橋が狭い、を介してのみの車を収容することができ、あなたが並列で2台の車を取得できませんでした。あなたは2台の車のAとBを持っている場合は、それぞれ、橋の両端からブリッジへ、そして車のために、それは左側に道路橋の部分を旅し(すなわち、ブリッジのリソースの一部の所有)、だけでなく、橋を渡るために、 Bは、車が前方に移動することはできません、その場合には、右に橋を作るために車を待たなければならず、Bの車のために、それは右のデッキの上に道路の部分を旅(ブリッジのリソースの一部のすなわち所有)を、橋を渡るために待機する必要があります車が左に橋を作り、その後、Bの車が前方に移動することはできません。車の両側は橋を作るために互いに待ちで、その結果、逆転されていないが、誰が道を与えるものではありません、それが延々と待ちます。この現象は、デッドロックです。デッドロックは、それを回避すべきである、プログラムの問題が実行されています。

代码示例:
publicclassデッドロック{
オブジェクトA =新しいオブジェクト();
オブジェクトB =新しいオブジェクト();

publicvoid toEast(){
同期(A){
同期(B){
するSystem.out.println( "向东行驶。");
}
}
}
toWest(){publicvoid
同期(B){
同期(A){
System.out.printlnは( "向西行驶")。
}
}
}
}
publicclass ToEastThreadスレッド{延び
デッドロックD =新しいデッドロック();
公共ToEastThread(デッドロックD){
スーパー()。
this.d = D;
}
publicvoidラン(){
d.toEast()。
}
}
publicclass ToWestThreadは{スレッドを拡張します
デッドロックD =新しいDEADLOCK();
公共ToWestThread(デッドロックD){
スーパー()。
this.d = D;
}
publicvoidラン(){
d.toWest()。
}
}
publicclass Test1を{
publicstaticvoidメイン(文字列[]引数){
デッドロックD =新しいデッドロック()。
ToEastThreadら=新しいToEastThread(D)。
ToWestThread重量=新しいToWestThread(D)。
et.start();
wt.start();
}
}


毎日17:00に実行14.タイマーTimerTaskを実現タイミングと実行タイミング。

知識ポイントの紹介:
(1)タイマー:タイマー、実際には、スレッドは、タイムスケジュールにTimerTasksを持っています。
(2)TimerTaskを:クラスの実行方法は、コードが実行ランインビボのタイミングを配置する必要があります。TimerTaskを一般的には、匿名クラスの道を作成しています。
シンタックスの説明:
java.util.Timerタイマー=新新java.util.Timer(真の);   
//真デーモンモード(低優先度、タイマーの実行を説明する   
javax.swingの、プログラムタイマーの//末尾にも自動的に終了)、注意   
使用済みのスイングバッグの輸入は、場合//パッケージには、Timerクラスを持つ   
//紛争の名前に注意を払います。   
=新規新しいタスクTimerTaskをTimerTaskを(){   
公共空RUN(){   
... //そこに置かれるたびに実行する必要があるコード。   
}   
};  
使用説明:
//以下の方法は、スケジュールされたタスクのいくつかである:   
 timer.schedule(タスク、時間);   
//型日付時刻:指定された時間に一度実行。   
 timer.schedule(タスク、FIRSTTIME、期間);   
// FIRSTTIME Date型の長周期   
開始から// FIRSTTIME時間、期間毎のミリ秒。   
timer.schedule(タスク、遅延)   
長い//遅延タイプ:今から遅延(ミリ秒)を通じ   
timer.schedule(タスク、遅延、期間)   
//遅延が長い、期間が長い:今から遅延(ミリ秒)を通じて後すべての期間は、   
一度//ミリ秒を実行します。  
例えば:
インポートjava.util.TimerTask;
{publicclass TimePrintTask TimerTaskを延びている
。INT I = 1
publicvoid RUN(){
System.out.printlnは(I)、
Iは++;
}
}
publicclassテスト{
publicstaticvoidメイン(文字列[]引数){
タイマ新しい新しい=タイマタイマ();
//timer.schedule(new TimePrintTask()、1000年、500);
DateFormatの新しい新DFは(てSimpleDateFormatを= "YYYY / MM / DD HH:MM:SS SS");
日付firstDate = nullを
試み{
firstDate = df.parse( "2016年12月9日午後五時○○分00秒00")。
}キャッチ(はParseException電子){
// TODO自動生成キャッチブロック
e.printStackTrace();
}
timer.schedule(新しいTimePrintTask()、firstDate、1000);
}
}

15.wait方法は、スレッドがロック解除リソースによって保持される、と呼ばれている?それを行うための睡眠方法はありますか?


待つ:CPUのリリースを、ロックが解除され、
SLEEP:リリースCPUは、ロックを解除しません。


16.wait、のnotifyAllメソッドを実行するオブジェクトのクラスで定義され、通知?どのような役割をしていますか?待って()、()に通知し、のnotifyAll()各オブジェクトが待機()、通知()、のnotifyAll()関数を持っていることを意味し、Threadクラスに属しているが、Objectクラスに属していません。各オブジェクトはロックが各画像に基づいているので、ロックを有し、(待機)、()を通知する、のnotifyAll()は、ロック方式に関連しています。

3つの方法の役割は以下のとおりです。
待ち時間:別のスレッドがオブジェクトの通知()メソッドまたはのnotifyAll()メソッドを呼び出すまで、現在のスレッドがブロックを入力するように待機します。現在のスレッドがこのオブジェクトのモニター(オブジェクトロック)を所有している必要があります。notifyメソッドまたはのnotifyAllメソッドを呼び出すことで、別のスレッドになるまで、このモニタと待機のスレッドリリースの所有権は、目を覚ますために、このオブジェクトのモニターで待機中のスレッドに通知します。スレッドを続行するために、モニターの所有権を取り戻すために、それまで待機します。
通知:ウェイクアップこのオブジェクトのモニター(オブジェクトロック)上の単一のスレッドを待つように。すべてのスレッドがこのオブジェクトで待機している場合は一つのスレッドを覚ます選択されます。このオブジェクトのロックまで、現在のスレッドが起こされるためにスレッドを続行するには、放棄するため。このメソッドは、呼び出すために、このオブジェクトの監視スレッドの所有者として使用する必要があります。
「現在のスレッドがこのオブジェクトのモニターを所有しなければならない」と「この方法が唯一の所有者を呼び出すために、このオブジェクトのモニターのスレッドとして使用されるべきで、」待ち時間を説明しましたこの方法は、(OBJ内)、すなわち同期、シンクブロック内で実行されなければならない方法と通知する。
のnotifyAll:ウェイクアップこのオブジェクト上のすべての監視スレッドを(オブジェクト・ロック)を待ちます。


17.notifyオブジェクトは、それに最初のスレッドプールを待つ目覚めさせることですどこ?


いいえ。ランダムに選択された、このオブジェクトの待機()メソッド閉塞スレッドを呼び出すからブロック解除のスレッドで()メソッドの結果を通知するために呼び出して、我々は、選択されるスレッドを予測することはできません。

消費者の問題 - プロデューサを達成するために、通信のスレッドを使用して18機]。

クラスのインスタンスを参照してください。

おすすめ

転載: www.cnblogs.com/ren549047861/p/11294158.html