スレッド間通信
コンセプト:同じリソース上で動作する複数のスレッドが、アクション(スレッドのタスクは)同じように扱われていません
:フォーカス資源の有効活用を
分析:これらのクラスの必要性
1つのリソースクラス:クラスバンズ
- パンのプロパティを設定します。
- 状態バンズ:真の偽はありません
2つの生産(包子プルトニウム)クラス:あるスレッドクラスは、Threadを継承することができます
- 設定するスレッドタスク(実行):生産バンズ
- パンの状態を判断するために、
真:バンズがあります
- 包子プルトニウムは、呼び出し待機メソッドを待ち状態に
偽:なしパン
- バンズの包子プルトニウムの生産
- いくつかの多様性を追加します。交互に2個のパンを作ります
- 二つの状態(I%2 == 0)があります。
- 包子プルトニウムは良いパンを作ります
- ステータスがtrueで変更バンズがあります
- 商品のスレッドを食べるウェイクので、そのスレッドのパンの食料品
3消費者(食料品)カテゴリ:Threadクラスは、Threadを継承することができます
- 設定してスレッドのタスク(RUN) :パン
- パンの状態を判断するために、
偽:なしパン
- 食料品のスレッドが待機状態にwaitメソッドを呼び出します
真:バンズがあります
- 食料品パン
- バン食料品を食べます
- パンのステータスを変更することで、偽なし
- 食料品は、包子プルトニウムスレッド、パンの生産を覚まします
4つの試験の種類:
- これは、mainメソッド、含まれているプログラムの実行の入口、プログラムの開始を
- パンのオブジェクトを作成します:
- 包子プルトニウムのスレッドは、パンのオープン、生産を作成します
- 食料品スレッド、オープン、パンを作ります。
注意:
- 包子プルトニウムスレッドとパンスレッド関係- >(相互に排他的)コミュニケーション、
- 同期技術もその一つだけ2内のスレッドの実行を確認する必要があります
- ロックオブジェクトは一意であることが保証されなければならない、あなたは、ロックオブジェクトのパンのようなオブジェクトを使用することができます
- 包子Puの商品カテゴリを食べて、クラスがパラメータとして渡されたパンのオブジェクトを必要とします
- 私たちは、メンバ変数の位置でパンを作成する必要があります
- 変数の代入のパンのために使用されるコンストラクタのパラメータ
パブリック クラスCaiNiao { 公共の 静的な 無効メイン(文字列[] args)を{ // ロックオブジェクトを作成し、唯一の保証 オブジェクトOBJ = 新しい新しいオブジェクト(); // スレッドの顧客(消費者)を作成し 、新たな新しいスレッド(){ @Override 公共 のボイドRUN(){ // バンズに購入することを待っている 間に(trueには){ // スレッドが目を覚ますのを待っている、唯一の実行を確認し、シンクロナス・テクノロジの使用が必要です (OBJ){syncharonized のSystem.out.printlnは(「上司が通知を希望します種類と量「バンズ); //コール待ち方法、WAITNG状態(無期限に待つ)にCPU進むを与える 試み{ ; obj.wait() } キャッチ{(InterruptedExceptionあるE) ; e.printStackTraceを() } // 後に実行ウェークアップコード、 のSystem.out。 println( "パンが完成し、食べ始めてきた!" ); System.out.printlnは( "--------------" ); } } } } .start(); // ボススレッドの作成(プロデューサー) 新しい新しいスレッド(){ @Override 公共 のボイドRUN(){ // ベークされて いる間に(trueに{) // ベーキング5秒かかり 試し{ のThread.sleep( 5000); //はベーキング5秒かかり } キャッチ(例外:InterruptedException Eを); e.printStackTrace(); } // 、実装に一つだけ待機し、ウェイクを確保するシンクロナス・テクノロジの使用が必要 (OBJ){syncharonized のSystem.out.println(顧客のパンを起こして、「餃子を作るために5秒を過ごした後、蒸しパンを行うには、通知メソッドを呼び出します" ); // パンをやった後、notifyメソッドを呼び出し、顧客のパンをウェイク )(obj.notify。 } } } .start(); }