手書き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))(開始)。
}
}