古典的な生産者と消費者の問題のシミュレーション。このプログラムは、最も単純なケース、つまり単一バッファリングをシミュレートします。実際の状況をシミュレートするために、アイテムの消費時とアイテムの生産時に遅延が追加されます。遅延を変更することで、さまざまな生成速度と消費速度をシミュレートできます。
[コード]
[/co/**
* シングルバッファのコンシューマ/プロデューサ問題。
* xu([email protected]) による。
* */
パブリック クラス ConsumerProducer {
静的オブジェクトバッファ = null;
静的オブジェクトミューテックス = new Object();
静的オブジェクト condConsumer = 新しい Object();
静的オブジェクト condProducer = new Object();
public static void main(String[] args) {
スレッドプロデューサー = new Thread() {
public void run() {
//for(int i=0; i<10; i++) {
for(int i=0; ; i++) {
// アイテムを生成します。
試す {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
String item = new String("item-" + i);
System.out.println("[プロデューサー] が生成した " + item);
// バッファが空になるまで待ちます。
同期された (condProducer) {
while(バッファ != null) {
試す {
condProducer.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// アイテムをバッファに置きます。
同期された (ミューテックス) {
バッファ = アイテム;
System.out.println("[プロデューサー] " + item + " をバッファに置きました。");
}
// 消費者に通知します。
同期された (condConsumer) {
condConsumer.notify();
}
}
}
};
スレッドコンシューマー = new Thread() {
public void run() {
//for(int i=0; i<10; i++) {
のために( ; ; ) {
// アイテムが来るのを待ちます。
同期された (condConsumer) {
while( バッファ == null ) {
試す {
condConsumer.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// バッファから項目を取得します。
文字列項目 = null;
同期された (ミューテックス) {
item = (文字列)バッファ;
バッファ = null;
System.out.println(" [コンシューマ] バッファから " + item + " を取得します。");
}
// アイテムを消費します。
試す {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(" [消費者] 消費 " + item);
// プロデューサーに通知します。
同期化 (condProducer) {
condProducer.notify();
}
}
}
};
Consumer.start();
プロデューサー.スタート();
}
}で]