#コード
パブリック クラスアプリ{ 公共 静的 ボイドメイン(文字列[]引数){ デポデポ = 新しいデポ(100 )。 プロデューサープロデューサー = 新しいプロデューサー(デポ)。 消費者の消費者 = 新しい消費者(デポ)。 producer.produce( 60 )。 consumer.consume( 100 )。 producer.produce( 90 )。 consumer.consume( 40 )。 } } クラスデポ{ // 仓库最大容量 プライベート int型の容量; // 仓库目前容量 プライベート int型のサイズ。 公共デポ(int型の容量){ この .size = 0 。 この .capacity = 能力; } 公共 同期 ボイド農産物(int型のval){ 試みる{ int型の余剰= ヴァルと、 一方、(余剰> 0 ){ 一方(サイズ> = 容量){ (待機)。 } int型incre =(サイズ+黒字)>容量?(容量- サイズ):余剰。 サイズ + = incre。 黒字 - = incre。 System.out.printf( "(%d)が生成する%の計画が実際に(%d)は、デポ・サイズ(%d)が\ nは生成" 、 にThread.currentThread()のgetName()、ヴァル、incre、サイズ) ; 通知()。 } } キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } } 公共 同期 無効消費(int型のval){ してみてください{ int型の余剰= ヴァル。 一方、(余剰> 0 ){ 一方(サイズ<= 0 ){ 待ちます(); } int型 DESC =(サイズ<余剰)?サイズ:黒字。 サイズ - = DESC; 黒字 - = DESC; System.out.printf( "(%のd)を消費する%の計画、actutally率(%D)を消費する、デポサイズ(%d)が\ n"は、 にThread.currentThread()のgetName()、ヴァル、DESC、サイズ) ; 通知()。 } }キャッチ(InterruptedExceptionある電子){ e.printStackTrace(); } } } クラスのプロデューサー{ プライベートデポデポ。 公共プロデューサ(デポデポ){ この .depot = デポ。 } 公共 ボイド農産物(最終 INT ヴァル){ 新しいスレッド(){ 公共 ボイドラン(){ depot.produce(ヴァル)。 } } .start(); } } クラスの消費者{ プライベートデポデポ; 公共の消費者(デポデポ){ この .depot = デポ; } 公共 ボイドは(消費最終 INT {ヴァル)を 新しいスレッド(){ 公共 ボイドラン(){ depot.consume(ヴァル)。 } } .start(); } }
#出力:
スレッド0生成する計画(60)は、実際に生成(60)、デポサイズ(60)
消費するスレッド3計画(40)が、actutally(40)を消費し、デポサイズ(20)
製造するスレッド2平面(90 )、実際に生成(80)、デポ・サイズ(100)
消費するスレッド1平面(100)、actutally(100)、デポサイズ(0)消費
、生成するスレッド2平面(90)は、実際に生成(10)デポサイズ(10)