シングルスレッドプログラム:プロセスフローは、常にプログラム行です。たとえば、次のメソッドを呼び出す、またはforループ、条件分岐if文のいずれか。さらに複雑な処理は、この記事では、長期的には影響しません。シングルスレッドのプログラム、「時間のある時点で、最大の実装」だけで。スレッドと呼ばれる「対象プログラムを実施しています」。
マルチスレッドプログラム:複数のスレッドで構成プログラム。例えば:I / O処理を、複数のクライアントを消費するGUIアプリケーション、時間。
平行:手段を操作する複数の表現は、「同時処理」。
同時:意味するために使用される「複数の部分に一つの操作を、注文処理を実行できるようにします。」
スレッドを開始する方法であって、(1)サブクラスのThreadクラスのインスタンスを使用して、スレッドを開始する;例えば:publicクラスPrintThreadはスレッド(2)を拡張実装クラスのRunnableインターフェース開始スレッドのインスタンスを使用して、例えば:パブリッククラスPrintThread実装Runnableを
相互に排他的なスレッドは:synchronizedキーワードで宣言メソッドの前に、同期。プラス、それは方法が唯一のスレッドで同時に実行できるようにすることができます。
クリティカルエリア:プログラムは実行範囲の単一スレッドのみを許可します。
同期を使用する:時間は、(1)マルチスレッド(2)複数のスレッドアクセス(3)の状態は、おそらく変更(4)への安全性を確保する必要がある場合場合
デッドロック:2つのスレッドがロックを保持し、ロック現象を解放するためにお互いを待ちました。
オーダー(1)複数のロールSharedSource SharedResourceロールのロックを保持し、同時に(2)スレッド、ロックSharedResource役割を取得するロックSharedResource他のロール(3)を取得したいではない:デッドロック状態が発生します固定PS(SharedResourceの役割は対称である):限り、デッドロック状態を防ぐことができます損傷など。
競合スレッド:スレッドの実行が重要なエリアを処理する場合、スレッドのクリティカルセクションを入力するために、他の欲求がブロックされます。
同期インスタンスメソッドを実行するスレッドは、このロックを取得する必要がありますが、ロックは唯一つのインスタンス内のスレッドを取得することができます。
アトミック操作:不可分操作。たとえば、次の同期操作を実行する方法。
Javaの基本タイプ(INTとCHAR)と操作のオブジェクト参照のタイプと参照割り当て原子です。しかし、長いと二重の操作がアトミックではありません。長いと二重のスレッド間で共有するときは、同期運転中にそれを置く必要がある、または揮発性として宣言します。
デッドロックの問題:例えば、2人は、食品のプレートを食べて、ナイフとフォーク、食べるためにナイフとフォークを持つユーザーのみ、ナイフ状況に男の出現にフォークが表示さを保持している人を防ぐには、ツールを取るために2つの順序を設定することができますナイフのために - またはあるフォークフォーク - ナイフ、または唯一食べるために、同時に2つのツールを持っています。次のようにシーケンスコードを設定すると、次のとおりです。
1つの パブリック クラス PrintThreadは拡張スレッド{ 2 プライベート文字列名を、 3 民間 最終ツールが左側。 4 民間 最終ツール右側。 5 公共PrintThread(文字列名、ツールは左側、ツールは右側){ 6 本 .nameの= 名前。 7 本 .lefthand = 左手。 8 本 .righthand = 右側。 9 } 10 公共 ボイドラン(){ 11 、一方(真){ 12 )(食べます。 13 } 14 } 15 公共 ボイド(食べる){ 16 同期(左側){ 17 のSystem.out.println(名+が"占有"+左+"()左。" ); 図18は、 同期(右側){ 19 のSystem.out.println(名+は+右側+ "(左) ""占有します" ;) 20 のSystem.out.println(名+ "食べています。" ); 21 のSystem.out.println(+左+ "(左) "名前+"ダウンプット" )。 22 System.out.println(名前+ + +右側"ダウンプット""(左)。" ); 23 } 24 } 25 } 26の パブリック 静的 クラスツール{ 27 民間 最終文字列名。 28 公衆ツール(文字列名){ 29 この .nameの= 名前。 30 } 31 パブリック文字列のtoString(){ 32 リターン "[" +名+ "]" 。 33 } 34 } 35 36 // パブリッククラスのmain(){ 37 パブリック 静的 ボイドメイン(文字列[]引数){ 38 ツールスプーン= 新しいツール(「スプーン」)。 39 ツールフォークは= 新しいツール(「フォーク」)。 40 新 PrintThread( "アリス" 、スプーン、フォーク).start(); 41 新 PrintThread( "borryが" 、スプーン、フォーク).start(); 42 } 43 }
finalクラス宣言され、サブクラスを作成することはできません。
クリティカルセクションは、エラーの可能性をチェックするために改善することができる拡張、エラーが早期に睡眠を見つけることができます。
プライベートフィールドはクラスの内部にアクセスすることができます; protectedフィールドは、このクラスのサブクラス、および同じパッケージ内のアクセスであってもよく、公共の場では、アクセスの任意の型であってもよいです。