手書き生産者 - 消費者モデル

手書きsychronizedと呼ばれる生産者 - 消費者モデルは、待って、機能のnotifyAll

 

パッケージproAndCsmModel01;

 

輸入java.util.LinkedList;

 

/ **

 *実現バッファ

 *

 * /

パブリッククラスResource01 {

    //最大バッファ

    民間最終int型のMAX_SIZE = 10;

    //バッファキュー

    LinkedListは<データ型>リスト=新しいLinkedListは<>();

 

    / **

     生産の*同期方法

     * /

    公共同期無効increaseData(){

            一方、(はlist.size()> = MAX_SIZE){

                {試します

                    System.out.println(にThread.currentThread()のgetId()+ "データウェアハウスがいっぱいです!");

                    待つ();

                }キャッチ(InterruptedExceptionある電子){

                    e.printStackTrace();

                }

            }

            データ型D =新しいデータ型();

            d.setData((int型)(Math.random()* 1000));

            list.add(D)。

            System.out.println(にThread.currentThread()のgetId()+ "生产:" + d.getData()+ "库存量:"。+はlist.size());

            notifyAll();

 

    }

 

    / **

     *消費データ同期方法

     * /

    公共同期無効decreaseData(){

            一方、(はlist.size()<= 0){

                {試します

                    System.out.println(にThread.currentThread()のgetId()+ "データウェアハウスが空であります!");

                    待つ();

                }キャッチ(InterruptedExceptionある電子){

                    e.printStackTrace();

                }

            }

            データ型D = list.poll()。

            System.out.println(にThread.currentThread()のgetId()+ "消费:" + d.getData()+ "库存量:"。+はlist.size());

            notifyAll();

    }

}

 

パッケージproAndCsmModel01;

 

/ **

 *メーカー:生産

 *

 * /

パブリッククラスproducer01は{Runnableを実装します

    プライベートResource01のresource01。

    producer01(Resource01のresource01){

        this.resource01 = resource01。

    }

    @オーバーライド

    ます。public void実行(){

        一方、(TRUE){

            {試します

                製造後にランダムに//スリープ

                Thread.sleep((ロング)(Math.random()* 1000));

            }キャッチ(InterruptedExceptionある電子){

                e.printStackTrace();

            }

            //生産の同期メソッドを呼び出し

            resource01.increaseData();

        }

    }

}

パッケージproAndCsmModel01;

 

/ **

 *消費:消費者情報

 *

 * /

パブリッククラスconsumer01は{Runnableを実装します

    プライベートResource01のresource01。

    consumer01(Resource01のresource01){

        this.resource01 = resource01。

    }

    @オーバーライド

    ます。public void実行(){

         一方、(TRUE){

             {試します

                 消費後//ランダムな睡眠

                 Thread.sleep((ロング)(Math.random()* 1000));

             }キャッチ(InterruptedExceptionある電子){

                 e.printStackTrace();

             }

             //消費の同期メソッドを呼び出し

             resource01.decreaseData();

         }

    }

}

パッケージproAndCsmModel01;

 

/ **

 *基本データ型

 *

 * /

パブリッククラスデータ型{

    プライベートint型のデータ。

 

    公共ボイドにsetData(int型データ){

        this.data =データ。

    }

 

    公共INTのgetData(){

        データを返します。

    }

}

パッケージproAndCsmModel01;

 

/ **

 *コール

 *

 * /

パブリッククラスのテスト{

    公共の静的な無効メイン(文字列agrs []){

        Resource01 resource01 =新しいResource01();;

        System.out.println(にThread.currentThread()のgetName()。)。

 

        新しいスレッド(新しいproducer01(resource01))(開始)。

        新しいスレッド(新しいproducer01(resource01))(開始)。

        新しいスレッド(新しいproducer01(resource01))(開始)。

        新しいスレッド(新しいproducer01(resource01))(開始)。

        新しいスレッド(新しいproducer01(resource01))(開始)。

        新しいスレッド(新しいproducer01(resource01))(開始)。

 

        新しいスレッド(新しいconsumer01(resource01))(開始)。

        新しいスレッド(新しいconsumer01(resource01))(開始)。

        新しいスレッド(新しいconsumer01(resource01))(開始)。

 

    }

}

おすすめ

転載: blog.csdn.net/qq_33391981/article/details/91044693
おすすめ