نفس:
1. LinkedBlockingQueue و ArrayBlockingQueue كلا من تنفيذ واجهة blockingqueue ؛
2. LinkedBlockingQueue و ArrayBlockingQueue كلاهما قوائم قابلة للانتشار
يتم استخدام إعادة إيندرانت وحالة داخليًا لضمان مزامنة الإنتاج والاستهلاك ؛
عندما تكون قائمة الانتظار فارغة ، يتم حظر خيط المستهلك ؛ عندما تكون قائمة الانتظار ممتلئة ، يتم حظر خيط المنتج ؛
استخدم طريقة الحالة لمزامنة وتواصل: Await () و Signal ()
مختلف:
1. كما يتضح من الصورة أعلاه ، فإن آلية القفل الخاصة بهم مختلفة.
يتم فصل الأقفال الموجودة في LinkedBlockingQueue ، وقفل المنتج ، وقفل المستهلك Takelock
يستخدم منتجو ArrayBlockingQueue والمستهلكين نفس القفل ؛
2. آلية التنفيذ الأساسية هي أيضا مختلفة
يحافظ LinkedBlockingQueue على بنية قائمة مرتبطة داخليًا
أثناء الإنتاج والاستهلاك ، يجب إنشاء كائنات العقدة للإدراج أو الإزالة. في الأنظمة ذات الدفعات الكبيرة من البيانات ، سيكون الضغط على GC أكبر.
يحافظ ArrayBlockingQueue على صفيف داخلي
أثناء الإنتاج والاستهلاك ، يتم إدخال كائنات التعداد مباشرة أو إزالتها ، ولا يتم توليد أو تدمير مثيلات كائن إضافية.
3. الاختلافات في البناء
يحتوي LinkedBlockingQueue على حجم سعة افتراضي: integer.max_value ، بالطبع ، يمكنك أيضًا تمرير حجم السعة المحدد.
عند تهيئة ArrayBlockingQueue ، يجب تمرير قيمة السعة.
يمكنك أن تعرف من خلال النظر في طريقة البناء المقدمة من ذلك
4. تنفيذ طريقة Clear ()
عندما تنفذ LinkedBlockingQueue الطريقة الواضح ، سيتم إضافة قفلان.
5. الإحصائيات عدد العناصر
يتم استخدام كائن AtomicInteger في LinkedBlockingQueue لحساب عدد العناصر
يستخدم ArrayBlockingQueue نوع int لعد العناصر