انسخ رمز الكود كما يلي:
حالة الحزمة
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
/**
* استخدم القفل والحالة لتنفيذ نموذج المنتج والمستهلك
* @المؤلف سوف
*
*/
الطبقة العامة ProducerConsumerDemo {
public static void main(String[] args) {
int ProducerCount = 10;
كثافة المستهلك = 15؛
Final ProducerConsumerDemo pcd = new ProducerConsumerDemo(5); // حجم المخزن المؤقت هو 5
Thread[] ProducerThreads = new Thread[producerCount];
for(int i = 0; i < ProducerCount; i++) {
ProducerThreads[i] = new Thread("producer" + (i+1)) {
@تجاوز
تشغيل الفراغ العام () {
pcd.produce();
}
};
}
Thread[] ConsumerThreads = new Thread[consumerCount];
for(int j = 0; j <consumerCount; j++) {
ConsumerThreads[j] = new Thread("consumer" + (j+1)) {
@تجاوز
تشغيل الفراغ العام () {
pcd.consume();
}
};
}
// ابدأ موضوع المستهلك المنتج
for(int i = 0; i < ProducerCount; i++) {
ProducerThreads[i].start();
}
for(int j = 0; j <consumerCount; j++) {
ConsumerThreads[j].start();
}
}
نهائي ثابت خاص DEFAULT_BUFFER_SIZE = 10؛
حجم المخزن المؤقت الخاص // حجم المخزن المؤقت
القائمة الخاصة <Object> bufferList;
قفل نهائي خاص lock = new ReentrantLock(true);
الحالة النهائية الخاصة condition = lock.newCondition();
عام ProducerConsumerDemo(int bufferSize) {
this.bufferSize = bufferSize > 0 ? bufferSize : DEFAULT_BUFFER_SIZE;
bufferList = new ArrayList<Object>(bufferSize);
}
// إنتاج
إنتاج الفراغ العام () {
lock.lock();
يحاول {
while(bufferList.size() == bufferSize) { // المخزن المؤقت ممتلئ
System.out.println("انتظر المنتج، الموضوع:" + Thread.currentThread().getName());
condition.await();
}
// إنتاج
bufferList.add(new Object());
System.out.println("يقوم المنتج بإنتاج واحد، الآن حجم المخزن المؤقت:"
+ bufferList.size() + "، والخيط: " + Thread.currentThread().getName());
condition.signalAll(); // إخطار المستهلكين
} التقاط (InterruptedException e) {
printStackTrace();
} أخيراً {
lock.unlock();
}
}
// استهلاك
استهلاك الفراغ العام () {
lock.lock();
يحاول {
while(bufferList.isEmpty()) { // المخزن المؤقت فارغ
System.out.println("انتظار المستهلك، الموضوع:" + Thread.currentThread().getName());
condition.await();
}
// استهلاك
bufferList.remove(0); // إزالة واحد من رأس القائمة المرتبطة
System.out.println("المستهلك الأول، الآن حجم المخزن المؤقت:"
+ bufferList.size() + "، والخيط: " + Thread.currentThread().getName());
condition.signalAll();
} التقاط (InterruptedException e) {
printStackTrace();
} أخيراً {
lock.unlock();
}
}
}