إذا كانت Blockingqueue ممتلئة ، فسيتم حظر أي عملية تُحاول تخزين الأشياء فيها ولن يتم إيقاظها لمواصلة العمليات حتى يكون هناك مساحة جديدة في Blockingqueue.
الأساليب الرئيسية التي يوفرها Blockingqueue هي:
إضافة (anobject): أضف anobject إلى blockingqueue.
عرض (anobject): أضف anobject إلى blockingqueue.
ضع (anobject): أضف anobject إلى blockingqueue.
استطلاع (الوقت): أخرج الكائن المرتبة الأولى في Plockingqueue. إرجاع لاغية عندما لا يمكن استردادها.
خذ (): أخرج الكائن المرتبة الأولى في Blockingqueue.
هناك 4 تطبيقات محددة من blockingqueue وفقا لاحتياجات مختلفة:
(1) arrayblockingqueue: يجب أن يكون لمؤسسة الحجم المحدد معلمة int للإشارة إلى حجمها. يتم فرز الكائنات التي تحتوي عليها في ترتيب FIFO (الأول ، الأول).
(2) LinkedBlocking: blockingqueue بحجم متفاوت.
إذا لم يتم تضمين معلمة الحجم ، يتم تحديد حجم blockingqueue الذي تم إنشاؤه بواسطة integer.max_value. يتم فرز الكائنات التي تحتوي عليها في ترتيب FIFO (الأول ، الأول).
بالمقارنة مع LinkedBlockingQueue و ArrayBlockingQueue ، تختلف هياكل البيانات المستخدمة خلفها.
تكون إنتاجية بيانات LinkedBlockingQueue أكبر من مجموعة ArrayBlockingQueue ، ولكن إمكانية التنبؤ بأداءها أقل من قلة ArrayBlockingQueue عندما يكون عدد المواضيع كبيرة.
(3) PriorityBlockingQueue: على غرار LinkedBlockingQueue ، ولكن فرز الكائنات التي يحتوي عليها ليس FIFO ، ولكن يتم تحديدها بواسطة ترتيب الفرز الطبيعي للكائنات أو الترتيب الذي يحدده المقارنة التي جلبها المنشئ.
(4) Synchronousqueue: blockingqueue خاص ، يجب إكمال تشغيله بالتناوب عن طريق وضع وجلب.
نسخة الكود كما يلي:
حزمة com.yao ؛
استيراد java.util.concurrent.arrayblockingqueue ؛
استيراد java.util.concurrent.blockingqueue ؛
استيراد java.util.concurrent.executorservice ؛
استيراد java.util.concurrent.executors ؛
الطبقة العامة blockingqueuetest {
/**
تحديد السلة ل Apple
*/
سلة فئة ثابتة عامة {
// سلة ، قادرة على عقد 3 تفاح
blockingqueue <string> سلة = جديد arrayblockingqueue <string> (3) ؛
// إنتاج التفاح ووضعها في سلة
Public Void Produce () رميات InterruptedException {
// ضع Apple في طريقة PUT.
سلة.
}
// تستهلك التفاح وأخذها من السلة
السلسلة العامة تستهلك () رميات interruptedException {
// Get Method تخرج Apple.
سلسلة apple = basket.take () ؛
إرجاع التفاح
}
الجمهور int getapplenumber () {
إرجاع سلة. size () ؛
}
}
// طريقة الاختبار
public static void testbasket () {
// بناء سلة مع التفاح
سلة سلة نهائية = سلة جديدة () ؛
// تحديد منتج Apple
منتج الفئة ينفذ Runnable {
تشغيل الفراغ العام () {
يحاول {
بينما (صحيح) {
// إنتاج Apple
System.out.println ("المنتج جاهز لإنتاج التفاح:"
+ system.currentTimeMillis ()) ؛
سلة.
System.out.println ("انتهى المنتج من إنتاج التفاح:"
+ system.currentTimeMillis ()) ؛
System.out.println ("بعد الإنتاج ، هناك تفاح:"+basket.getAppplenumber ()+") ؛
// 300ms النوم
thread.sleep (300) ؛
}
} catch (InterruptedException ex) {
}
}
}
// تحديد مستهلكي Apple
يستهلك المستهلك الفئة Runnable {
تشغيل الفراغ العام () {
يحاول {
بينما (صحيح) {
// استهلاك Apple
System.out.println ("المستهلكون مستعدون لاستهلاك Apple:"
+ system.currentTimeMillis ()) ؛
سلة. consume () ؛
System.out.println ("المستهلك يستهلك Apple"
+ system.currentTimeMillis ()) ؛
System.out.println ("بعد الاستهلاك ، هناك تفاح:"+basket.getAppPlenumber ()+") ؛
// 1000ms النوم
thread.sleep (1000) ؛
}
} catch (InterruptedException ex) {
}
}
}
خدمة ExecutorService = Executors.NewCachedThreadPool () ؛
منتج المنتج = منتج جديد () ؛
المستهلك المستهلك = مستهلك جديد () ؛
Service.Submit (منتج) ؛
Service.Submit (المستهلك) ؛
// بعد تشغيل البرنامج لمدة 10 ثوانٍ ، سيتم إيقاف جميع المهام
يحاول {
thread.sleep (10000) ؛
} catch (InterruptedException e) {
}
service.shutdownNow () ؛
}
الفراغ الثابت العام الرئيسي (سلسلة [] args) {
blockingqueuetest.testbasket () ؛
}
}