| - デマンド説明
| - 実装
ああ、この問題は、詳細なコードのコメントを参照して、消費者と生産者の古典とみなすことができます
| - コンテンツコード
1 / ** 2 * @auther :: 9527 3 * @description:消费者 4 * @program:多线程 5 * @Create:2019年8月10日10時45 6 * / 7 パブリック クラスの消費者が延びスレッド{ 8 プライベート仲介半ば= nullを。 9 10 11 公共消費者(){ 12 } 13 14 公共消費者(仲介映画){ 15 この .MID = ムービー。 16 } 17 18 @Override 19 パブリック ボイドRUN(){ 20は // サイクル50回映画情報表示 21である ため(int型 I = 0、I 1000を<; Iは++ ){ 22で 試み{ 23である のThread.sleep(100 ); 24 } キャッチ(InterruptedExceptionあるE){ 25 e.printStackTrace(); 26れる } 27 この.mid.get(); 28 } 29 } 30 }
1 / ** 2 * @auther :: 9527 3 * @description: 4 * @program:多线程 5 * @Create:2019年8月10日10時39分 6 * / 7 パブリック クラスプロデューサーが実装 Runnableを{ 8 // 生产数据 9 プライベート仲介半ば= nullを。 10 プライベート ブールフラグ= 偽; 11 12 公共プロデューサ(仲介ムービー){ 13 この .MID = ムービー。 14 } 15 16 公共{プロデューサー() 。17 } 18である 。19 @Override 20は 公共 ボイドRUN(){ 21は // 交互二つのフィルム記録サイクルエントリ、 22である ために(int型、Iは<1000; I = 0 I ++ ){ 23が IF (フラグに) { 24 この .mid.set(「ジャックは言った:」「私は水道メーターを確認してください」); 25 フラッグ= 偽; 26 } 他{ 27 本 .mid.set(「ローズは言った:」「あなたは誰ですか? " ); 28 フラグに= trueに。 29 } 30 } 31 } 32 }
1 パッケージcom.duo; 2 。3 / ** 4 * 9527 :: @auther 。5 * @description:生産者と消費者 6 * @program:マルチスレッディング 。7 * @Create:2019年8月10日10:36 。8 * / 9 パブリック クラス仲介{ 10 プライベート文字列名; 11 プライベート文字列情報、 12は 専用 ブール =フラグにtrueに ; // フラグが制御プロデューサを生成するように、設定されている、消費者支出 13は、 14 公共の文字列のgetName(){ 15 リターン名; 16 } 17 18 公衆ストリングGETINFO(){ 19 リターン情報; 20 } 21 22 公共の仲介(文字列名、文字列情報){ 23 この .nameの= 名前。 24 本の.info = 情報。 25 } 26 27 公共の仲介(){ 28 } 29 30 公共 同期 ボイド 集合(文字列名、文字列情報){ 31 であれば(!フラグ){ 32 のtry { 33 スーパー .WAIT(); // 当前线程等待 34 } キャッチ(InterruptedExceptionある電子){ 35 e.printStackTrace(); 36 } 37 } 38 この .nameの= 名前。 39 試み{ 40 のThread.sleep(100 )。 41 } キャッチ(InterruptedExceptionある電子){ 42 e.printStackTrace(); 43 } 44 本の.info = インフォメーション。 45 フラグ= 偽; // 個人消費ように、フラグをリセット 46は スーパー .notify(); // 使用してオブジェクトのメソッドを通知する、消費者スレッドが起きるように 47 } 48 公共 同期 ボイドGET(){ 49 IF (フラグに){ 50 トライ{ 51は スーパー; .WAIT() 52である } キャッチ(InterruptedExceptionあるE){ 53は e.printStackTrace(); 54である } 55 } 56である のSystem.out.println(この .getName()+ " - " + この.getInfo() ); 57である =フラグにtrueに、 58 超 .notify(); // ウェイクアップスレッド 59 } 60 }
1 / ** 2 * 9527 :: @auther 3。 * @description:テストクラス 4。 * @program:マルチスレッディング 。5 * @Create:2019年8月10日11時47分 。6 * / 7 パブリック クラスのテスト{ 8 パブリック 静的 ボイドメイン(文字列[]引数){ 9 // 製造=== >>取る離れて作製した 10 仲介MID = 新しい新)仲介(; 11 スレッドプロデューサー= 新しい新しいスレッド(新しい新プロデューサ(MID)); 図12は、ある スレッド=消費者の新しい新しいスレッド(新新消費者(MID)); 13 producer.start()。 14 consumer.start()。 15 } 16 }
| - 業績