パッケージcom.shopping.test、 パブリック クラスShaoKao { // 文字列 の文字列チュアン; // 肉 ストリングROU; //バーベキュー状態、初期状態は、バーベキューされていない ブール =フラグにfalseに、 パブリックストリングgetChuan(){ 戻りチュアンを; } 公共 無効setChuan(文字列チュアン){ この .chuan = チュアン; } パブリック文字列getRouを(){ 戻り、ROU } 公共 ボイドsetRou(文字列ROU){ この .rou =をROU; } パブリック ブールisFlag(){ 戻りフラグ。 } 公共 ボイド SETFLAG(ブーリアンフラグ){ この .flag = フラグ。 } }
以下は、プロデューサーであります
以下のためのパッケージ変更com.shopping.test; / * *注: *バーベキュー食料品店のスレッドとスレッドの関係--->コミュニケーション(排他) *同期技術は、唯一の二つのスレッドの実行中にあることを確実にするために使用されなければならない 唯一のロックオブジェクトことを確認する必要があります* 、あなたはロックオブジェクトとしてバーベキューオブジェクトを使用することができます *バーベキュー食料品店のクラスとクラスがパラメータとしてバーベキューオブジェクトに渡す必要があります * 1。バーベキュー変数の部材の位置を作成する必要がある 変数のバーベキューに代入* 2引数のコンストラクタを、 * / パブリック クラス ShaoKaoPu 延びスレッド{ // 1部材がロック対象としてバーベキュー可変位置作成する必要が プライベートShaoKao BZを; // 変数バーベキューに割り当て2.コンストラクタパラメータ、 パブリックShaoKaoPu(ShaoKao BZ){ これを = .BZ BZ; } // タスクスレッド(ラン)、バーベキューの生産セット 公共 ボイドRUNを(){ // 決定バーベキューを行うにはどのような最終的に詰めする変数を定義 int型の COUNT = 0 ; // 店は、バーベキューグリル生産されているように、無限ループを しながら(trueにする){ //は、2つのだけのスレッドを持つことができ、同期技術を確保するために使用されなければなりません実行する 同期(BZ){ // 状態の裁判官のバーベキュー IF(bz.flag == trueに){ // 、、バーベキューを持って生成しないバーベキュー店コール待ち法待機状態に 試し{ bz.wait( ); } キャッチ(InterruptedExceptionあるE){ e.printStackTrace(); } } //食料品を目覚めさせた後、そこにバーベキューの証拠はありませんが、また、バーベキュー生産を開始しました //は、いくつかの楽しみを追加:代替バーベキューの生産 IF(COUNTは%2 == 0 ){ // 農産物ラムの串焼き bz.chuan =「大きな文字列を」; BZ .rou = "子羊" ; } 他{ // 産牛肉玉ねぎスタッフィング bz.chuan = "大きな文字列" ; bz.rouは = "子羊" ; } COUNT ++ ; System.out.printlnは( "バーベキューショップが生産しています:" + bz.chuan + bz.rou + "バーベキュー" ); //生産はBarbecueに3秒かかり 試し{ のThread.sleep( 3000 ); } キャッチ(InterruptedExceptionあるE){ ; e.printStackTrace() } // たバーベキューグリルの良い生産ショップ、真のバーベキューの変更状態 = bz.flagを真; // ウェイクアップと食べるバーベキュー食料品のスレッドが bz.notify(); // バーベキュー店は良いバーベキュー生産している のSystem.out.printlnを(+ bz.chuan + bz.rou +「バーベキュー」「良いバーベキューショップが生産しています」 + "食料品を食べ始めることができます" ); } } } }
消費者
パッケージcom.shopping.test; パブリック クラス ChiHuo 拡張{スレッド // 1.メンバーは、ロックオブジェクトとしてバーベキュー変数の位置を作成する必要があります プライベートShaoKao BZを; // 変数のバーベキューに割り当て2.コンストラクタのパラメータ、 公共ChiHuo (ShaoKao BZ){ この .BZ = BZ; } // 設定したスレッドのタスク(実行)、食べるバーベキュー 公共 ボイドRUN(){ // 無限ループなので、バーベキューの商品が食べている食事を しばらく(trueに{) //が同期テクノロジを使用する必要があります。その2つのスレッドが唯一の実行を保証するために 同期(BZ){ // 状態判定バーベキュー IF(== bz.flagfalseに{) // 何のグリルを見つけていない、食料品は、waitメソッドが待ち状態に入り、呼び出し、その敷設バーベキューグリルを行う 試み{ bz.waitを(); } キャッチ(InterruptedExceptionあるE){ e.printStackTrace(); } } //はバーベキューですウェイクアップショップの後に、実績のあるバーベキューを食べる (「食料品を食べていた:」+ bz.chuan + bz.rou +「バーベキュー」をするSystem.out.printlnを); // 食料品は、バーベキューを食べ // バーベキューが偽の変更何 bz.flagない= 偽; //は、バーベキューグッズショップスレッドウェイクを食べる、バーベキュー生産し続ける (bz.notifyを)。 System.out.println( "食料品が置かれています:" + bz.chuan + bz.rou + "バーベキューが終わっ" ); System.out.printlnは(「-------------- -------------------------------------------------- ----------- " ); } } } }
テスト:
用パッケージ変更com.shopping.test、 パブリック クラスのテスト{ 公共 静的 ボイドメイン(文字列[]引数){ // ロックオブジェクトとして、オブジェクトバーベキューを作成 ShaoKaoのBZ = 新しい新しいShaoKao(); // スレッドバーベキューショップ作成 新しい新しいShaoKaoPu(BZ)を.start(); // スレッドオープン食料品 新新ChiHuo(BZ).start(); } }
出力は次のとおりです。
BBQショップが生産している:焼きラムの大きな文字列
バーベキュー店は食べに始めることができる良い羊肉のバーベキューの食料品の大規模な文字列を生成した
マトンバーベキューの大きな文字列:食料品を食べている
食料品が置かれています:羊肉のバーベキューの大きな文字列が終了
---------- -------------------------------------------------- ---------------
バーベキューショップが生産している:焼きラムの大きな文字列
バーベキュー店は良い羊肉のバーベキュー食料品の大きな文字列を食べに開始することができ生産している
食料品を食べている:マトンバーベキューの大きな文字列
食料品が置かれています:大きな文字列をラムバーベキュー終了
--------------------------------------------- ------------------------------
バーベキューショップが生産している:焼きラムの大きな文字列
バーベキューショップが開始することができます良い羊肉のバーベキューの食料品の大規模な文字列を生成しました食べて
食べて食べ品は以下のとおりです。羊肉のバーベキューの大きな文字列
食料品が置かれています終えた羊肉のバーベキューの大きな文字列
------------------------------ ---------------------------------------------