محاكاة لمشكلة المنتج والمستهلك الكلاسيكية. يحاكي هذا البرنامج أبسط حالة - التخزين المؤقت الفردي. من أجل محاكاة الوضع الفعلي، يتم إضافة تأخير عند استهلاك الصنف وإنتاج الصنف، ويمكنك محاكاة معدلات التوليد والاستهلاك المختلفة عن طريق تعديل التأخير.
[شفرة]
[/ شارك / **
* مشكلة المستهلك والمنتج العازلة واحدة.
* بواسطة شو ([email protected]).
* */
منتج المستهلك من الفئة العامة {
static Object buffer = null;
static Object mutex = new Object();
static Object condConsumer = new Object();
كائن ثابت condProducer = new Object();
public static void main(String[] args) {
منتج الموضوع = موضوع جديد () {
تشغيل الفراغ العام () {
//ل(int i=0;i<10;i++) {
ل(int i=0; ; i++) {
// إنتاج العنصر.
يحاول {
Thread.sleep(1000);
} قبض على (InterruptedException e) {
printStackTrace();
}
String item = new String("item-" + i);
System.out.println("[منتج] تم إنتاجه" + item);
// انتظر حتى يصبح المخزن المؤقت فارغًا.
متزامن (condProducer) {
بينما (المخزن المؤقت! = فارغ) {
يحاول {
condProducer.wait();
} قبض على (InterruptedException e) {
printStackTrace();
}
}
}
// ضع العنصر في المخزن المؤقت.
متزامن (موتكس) {
المخزن المؤقت = العنصر؛
System.out.println("[المنتج] وضع " + item + " في المخزن المؤقت.");
}
// إخطار المستهلكين.
متزامن (condConsumer) {
condConsumer.notify();
}
}
}
};
مستهلك الموضوع = موضوع جديد () {
تشغيل الفراغ العام () {
//ل(int i=0;i<10;i++) {
ل( ؛ ؛ ) {
// انتظر وصول العنصر.
متزامن (condConsumer) {
بينما (المخزن المؤقت == فارغ) {
يحاول {
condConsumer.wait();
} قبض على (InterruptedException e) {
printStackTrace();
}
}
}
// الحصول على العنصر من المخزن المؤقت.
عنصر السلسلة = فارغ؛
متزامن (موتكس) {
العنصر = (سلسلة) المخزن المؤقت؛
المخزن المؤقت = فارغ؛
System.out.println("[المستهلك] يحصل على "+ item+" من المخزن المؤقت.");
}
// استهلاك العنصر.
يحاول {
Thread.sleep(500);
} قبض على (InterruptedException e) {
printStackTrace();
}
System.out.println("[المستهلك] comsumed" + item);
// إخطار المنتجين.
متزامن (condProducer) {
condProducer.notify();
}
}
}
};
Consumer.start();
Producer.start();
}
}دي]