生産者と消費者--synchronized

#コード

パブリック クラスアプリ{ 

    公共 静的 ボイドメイン(文字列[]引数){ 

        デポデポ = 新しいデポ(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)

おすすめ

転載: www.cnblogs.com/lwmp/p/11512636.html