生産者 - 消費者モデルの単純な実装

以下のためのパッケージ変更com.ring2.test; 

/ ** 
 *銃の定義はわずか20の弾丸を充填することができる
 数は、生産を停止する20箇条書き、銃弾の生産よりも大きい場合に起こされるのを待って、* 
 弾丸が0に等しい場合*、消費弾丸を撮影停止するように、起こされるのを待っている
 * 
 * / 
パブリック クラスガン{
     プライベート 静的 int型の弾丸= 0 ;
     プライベート 静的 int型 maxBullet = 20 ;
     プライベート 静的「と同じ、オブジェクトの」文字列=ロック;
     静的 クラスのプロバイダ実装のRunnable { 
        @Override 
        公共 のボイドRUN(){
             INT0 = I、I 20は、<; I ++は){
                 試み{ 
                    のThread.sleep( 1000年); 
                } キャッチ(InterruptedExceptionあるE){ 
                    e.printStackTrace(); 
                } 
                同期(ロック){
                     IF(弾丸== maxBullet){
                         試み{ 
                            ロック.WAIT(); 
                            のSystem.out.println( "フルボア、ローディングは通知を待って、停止している。" ); 
                        } キャッチ(InterruptedExceptionあるE){ 
                            e.printStackTrace();
                        } 
                    } 
                    弾丸 ++ ; 
                    のSystem.out.println(にThread.currentThread()のgetName() + "完了装填、カートリッジの現在の数は、" + 弾丸); 
                    Lock.notifyAll(); 
                } 
            } 
        } 
    } 

    静的 クラス消費者実装のRunnable { 
        @Override 
        公共 ボイドRUN(){
             のためにint型 I = 0;私は20を<することであり、私は++ ){
                 試み{ 
                    のThread.sleep( 1000); 
                }キャッチ(InterruptedExceptionある電子){ 
                    e.printStackTrace(); 
                } 
                同期(ロック){
                     場合(弾丸== 0 ){
                         試みる{ 
                            )(Lock.waitします。
                            System.out.println( "子弹数量为空、等待装子弹。" ); 
                        } キャッチ(InterruptedExceptionある電子){ 
                            e.printStackTrace(); 
                        } 
                    } 
                    弾丸 - のSystem.out.println(にThread.currentThread()のgetName() + "ワンショットが完了すると、カートリッジの現在の数は、" + 弾丸); 
                    Lock.notifyAll(); 
                } 

            } 
        } 
    } 
    パブリック 静的 ボイドメイン(文字列[]引数){ 
        System.out.printlnは( "スレッド開始" )、
         新しい新しいスレッド(新しい新しいプロバイダ())開始();
         新しい新しいスレッド(新しい新しい消費者())開始();. 
    } 
    }

結果:

スレッドに開始
スレッドを -0読み込みが完了すると、弾丸の現在の数は次のとおりです。1 
スレッド -1ショットを完了し、弾丸の現在の数がある:0 
スレッド -0読み込みが完了すると、弾丸の現在の数は次のとおりです。1つの
スレッド -1ショットを完了し、カートリッジの現在の数である:0 
スレッド -0ローディングを完了し、カートリッジの現在の数は、1つの
カートリッジの数は、ローディング弾を待って、空です。
スレッド -1ワンショットの完了は、カートリッジの現在の数:0 
スレッド -0ローディングを完了し、カートリッジの現在の数が:. 1 
スレッド -1カートリッジの現在の数に1つのショットの完了:0 
スレッド -0ロード現在の弾丸を完了します:. 1の量
スレッド -1ワンショットの完了は、カートリッジの現在の数:0 
スレッド -0ローディングを完了し、カートリッジの現在の数が:. 1 
スレッド -1カートリッジの現在の数に1つのショットの完了:0 
スレッド -0パッケージを完成しますシェル、カートリッジの現在の数:1 
スレッド -1ワンショットが完了すると、カートリッジの現在の数:0 
スレッド -0ローディングを完了し、カートリッジの現在の数は、1つの
カートリッジの数は、ローディング弾を待って、空です。
スレッド-1ワンショットの完了は、カートリッジの現在の数:0 
スレッド -0ローディングを完了し、カートリッジの現在の数が:. 1 
スレッド -1カートリッジの現在の数に1つのショットの完了:0 
スレッド -0ローディングを完了し、カートリッジの現在の数:. 1は
スレッド -1カートリッジの現在の数に1つのショットの完了:0 
スレッド -0ローディングを完了し、カートリッジの現在の数が:. 1 
スレッド -1カートリッジの現在の数に1つのショットの完了:0 
スレッド -0ローディングを完了します弾丸の現在の数:1つの
カートリッジの数がローディング弾を待って、空です。
スレッド -1ワンショットの完了は、カートリッジの現在の数:0 
スレッド -0ローディングを完了し、カートリッジの現在の数が:. 1 
スレッド -1カートリッジの現在の数に1つのショットの完了:0 
スレッド -0ロード現在の弾丸を完了します:. 1の量
スレッド -1ワンショットの完了は、カートリッジの現在の数:0 
スレッド -0ローディングを完了し、カートリッジの現在の数が:. 1 
スレッド -1カートリッジの現在の数に1つのショットの完了:0 
スレッド -0パッケージを完成しますシェルは、カートリッジの現在の数として1 :. 
スレッド-1ワンショットの完了は、カートリッジの現在の数:0 
スレッド -0ローディングを完了し、カートリッジの現在の数は、1つの
カートリッジの数は、ローディング弾を待って、空です。
スレッド -1ワンショットの完了は、カートリッジの現在の数:0 
スレッド -0ローディングを完了し、カートリッジの現在の数が:. 1 
スレッド -1カートリッジの現在の数に1つのショットの完了:0 
スレッド -0ロード現在の弾丸を完了します:. 1の量
スレッド -1カートリッジの現在の数に1つのショットの完了:0 
スレッド -0ローディングを完了し、カートリッジの現在の数が:. 1 
スレッド -1カートリッジの現在の数に1つのショットの完了:0
コードの表示

 

おすすめ

転載: www.cnblogs.com/ring2/p/11351263.html