次のようにコードをコピーします。
パッケージの状態。
java.util.ArrayListをインポートします。
java.util.Listをインポートします。
インポート java.util.concurrent.locks.Condition;
インポート java.util.concurrent.locks.Lock;
インポート java.util.concurrent.locks.ReentrantLock;
/**
* ロックと条件を使用して生産者/消費者モデルを実装する
* @author は
*
*/
パブリック クラスProducerConsumerDemo {
public static void main(String[] args) {
int プロデューサーカウント = 10;
int ConsumerCount = 15;
最終ProducerConsumerDemo pcd = newProducerConsumerDemo(5) // バッファサイズは5です。
Thread[]プロデューサースレッド = 新しいスレッド[プロデューサーカウント];
for(int i = 0; i < プロデューサーカウント; i++) {
生産者スレッド[i] = 新しいスレッド("生産者" + (i+1)) {
@オーバーライド
public void run() {
PCD.プロデュース();
}
};
}
Thread[] ConsumerThreads = 新しい Thread[consumerCount];
for(int j = 0; j < ConsumerCount; j++) {
ConsumerThreads[j] = new Thread("consumer" + (j+1)) {
@オーバーライド
public void run() {
PCD.consume();
}
};
}
//プロデューサーコンシューマースレッドを開始します
for(int i = 0; i < プロデューサーカウント; i++) {
プロデューサースレッド[i].start();
}
for(int j = 0; j < ConsumerCount; j++) {
ConsumerThreads[j].start();
}
}
プライベート静的最終整数 DEFAULT_BUFFER_SIZE = 10;
private intbufferSize // バッファサイズ;
private List<Object> バッファリスト;
プライベート最終ロック lock = new ReentrantLock(true);
プライベート最終条件条件 = lock.newCondition();
publicProducerConsumerDemo(intbufferSize) {
this.bufferSize = バッファサイズ > 0 ? バッファサイズ : DEFAULT_BUFFER_SIZE;
bufferList = 新しい ArrayList<Object>(bufferSize);
}
// 生産
パブリック void プロデュース() {
lock.lock(); // ロック
試す {
while(bufferList.size() ==bufferSize) { // バッファがいっぱいです
System.out.println("プロデューサーは待機します、スレッド: " + Thread.currentThread().getName());
条件.await();
}
// 生産
bufferList.add(new Object());
System.out.println("プロデューサーは 1 つを生成します。現在のバッファ サイズ: "
+bufferList.size() + "、およびスレッド: " + Thread.currentThread().getName());
condition.signalAll(); // 消費者に通知します
} catch(InterruptedException e) {
e.printStackTrace();
} ついに {
ロック解除();
}
}
// 消費
public void Consumer() {
lock.lock(); // ロック
試す {
while(bufferList.isEmpty()) { // バッファは空です
System.out.println("コンシューマは待機します、スレッド: " + Thread.currentThread().getName());
条件.await();
}
// 消費
bufferList.remove(0); // リンクリストの先頭から 1 つ削除します。
System.out.println("コンシューマ コンシューマ 1、現在のバッファ サイズ: "
+bufferList.size() + "、およびスレッド: " + Thread.currentThread().getName());
条件.signalAll();
} catch(InterruptedException e) {
e.printStackTrace();
} ついに {
ロック解除();
}
}
}