تحتاج إلى قائمة انتظار يمكنها دعم العديد من القراء

StackOverflow https://stackoverflow.com/questions/1426342

سؤال

أحتاج إلى قائمة انتظار يمكن معالجتها بواسطة عدة قراء.

سيقوم القراء بإلغاء تحديد عنصر وإرساله إلى خدمة REST.

ومن المهم ملاحظة ما يلي:

  • يجب على كل قارئ أن يقوم بتصفية العناصر المختلفة.إذا كانت قائمة الانتظار تحتوي على عناصر A وB وC، فيجب على الخيط 1 أن يزيل A والخيط 2 يجب أن يزيل B بطريقة متزامنة.وهكذا حتى لا يكون هناك شيء في قائمة الانتظار.
  • أدرك أنه من المكثف استخدام وحدة المعالجة المركزية (CPU) للتشغيل دائمًا في حلقة مشغولة، وإلقاء نظرة خاطفة على قائمة الانتظار بحثًا عن العناصر.لذلك لست متأكدًا مما إذا كانت قائمة انتظار الحظر خيارًا جيدًا.

ما هي خياراتي؟

هل كانت مفيدة؟

المحلول

قائمة الانتظار المتزامنة أو LinkedBlockingQueue هناك خياران يتبادران إلى ذهنك على الفور، اعتمادًا على ما إذا كنت تريد سلوك الحظر أم لا.

كما يلاحظ أدامسكي، take() طريقة LinkedBlockingQueue لا يحرق دورات وحدة المعالجة المركزية دون داع أثناء انتظار وصول البيانات.

نصائح أخرى

لست متأكدًا من وصف سؤالك ما إذا كانت الخيوط تحتاج إلى فصل العناصر بطريقة صارمة.على افتراض أن هذا ليس قيدًا يمكنك استخدامه BlockingQueuetake() الطريقة التي ستؤدي إلى حظر مؤشر الترابط حتى تتوفر البيانات (وبالتالي لا تستهلك وحدة المعالجة المركزية دورات).

لاحظ ذلك أيضًا take() التطبيقات ذرية (على سبيل المثال LinkedBlockingQueue):إذا تم حظر عدة سلاسل رسائل take() ويتم وضع عنصر واحد في قائمة الانتظار بعد ذلك واحد فقط سيعود استدعاء take() الخاص بمؤشر الترابط؛والآخر سيبقى محظورا.

يتمثل الاختلاف الرئيسي بين ConcurrentLinkedQueue وLinkedBLockingQueue في إنتاجيته.في ظل تنافس مؤشر الترابط المعتدل، يتفوق ConcurrentLinkedQueue بشكل كبير على جميع قوائم BlockingQueues الأخرى.ومع ذلك، في ظل المنافسة الشديدة، يعد BlockingQueue خيارًا أفضل قليلاً لأنه سيضع بشكل مناسب سلاسل الرسائل المتنافسة في مجموعة سلاسل الرسائل المنتظرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top