تكون واجهة قائمة الانتظار في نفس المستوى مثل القائمة والتعيين ، وكلاهما يرث واجهة التجميع. تنفذ LinkedList واجهة قائمة الانتظار. تضيق واجهة قائمة الانتظار الوصول إلى طريقة LinkedList (أي ، إذا كان نوع المعلمة في الطريقة عبارة عن قائمة انتظار ، فيمكنها الوصول فقط إلى الأساليب المحددة بواجهة قائمة الانتظار ، ولا يمكن الوصول مباشرة إلى الطرق غير المترابط للقائمة ذات القائمة) ، بحيث يمكن استخدام الطريقة المناسبة فقط. يرث Plockingqueue واجهة قائمة الانتظار.
قائمة الانتظار هي بنية بيانات. يحتوي على عمليتين أساسيتين: إضافة عنصر في نهاية قائمة الانتظار ، وإزالة عنصر من رأس قائمة الانتظار يعني أن قائمة الانتظار تدير البيانات بطريقة أولى في الأول. إذا حاولت إضافة عنصر إلى قائمة انتظار حظر كاملة أو إزالة metaSector من قائمة انتظار حظر فارغة ، فسوف يتسبب ذلك في حظر الخيط. يعد حظر قوائم الانتظار أداة مفيدة عند التعاون مع مؤشرات ترابط متعددة. يمكن لخيوط العمال تخزين النتائج المتوسطة بانتظام في قائمة انتظار الحظر بينما تأخذ مؤشرات ترابط العمال الأخرى نتائج وسيطة وتعديلها في المستقبل. يوازن قائمة الانتظار تلقائيًا الحمل. إذا تم تشغيل مجموعة الخيط الأول أبطأ من الثانية ، فسيتم حظر مجموعة الخيط الثاني أثناء انتظار النتيجة. إذا تم تشغيل مجموعة الخيط الأول بسرعة ، فسوف ينتظر تعيين الخيط الثاني للحاق بالركب. يوضح الجدول التالي عمليات حظر قوائم الانتظار في JDK1.5:
أضف metasearch إذا كانت قائمة الانتظار ممتلئة ، رمي استثناء iiiegaislabeeplian
قم بإزالة العنصر وإرجاعه على رأس قائمة الانتظار. إذا كانت قائمة الانتظار فارغة ، يتم طرح استثناء nosuchelementexception.
العنصر يرجع العنصر على رأس قائمة الانتظار. إذا كانت قائمة الانتظار فارغة ، يتم طرح استثناء nosuchelementexception.
عرض إضافة عنصر وإرجاع صحيح إذا كانت قائمة الانتظار ممتلئة ، ارجع كاذبة
استطلاع الرأي يزيل ويعيد العنصر في رأس قائمة الانتظار. إذا كانت قائمة الانتظار فارغة ، فالتراجع الفارغ.
نظرة خاطفة إرجاع العنصر على رأس قائمة الانتظار. إذا كانت قائمة الانتظار فارغة ، فالتراجع عن الفرق
ضعي إضافة عنصر إذا كانت قائمة الانتظار ممتلئة ، وتمنع
خذ إزالة وأرجع العنصر على رأس قائمة الانتظار. إذا كانت قائمة الانتظار فارغة ، فالكتل
إزالة ، العنصر ، العرض ، استطلاع ، وإلقاء نظرة خاطفة ينتمي فعلا إلى واجهة قائمة الانتظار.
يمكن تقسيم العمليات التي تمنع قوائم الانتظار إلى الفئات الثلاث التالية وفقًا لاستجاباتها: AAD ، removee ، وعمليات العناصر ترمي استثناءات عند محاولة إضافة عناصر إلى قائمة انتظار كاملة أو الحصول على عناصر من قائمة انتظار فارغة. بالطبع ، في برنامج متعدد مؤشرات الترابط ، قد يصبح قائمة الانتظار ممتلئة أو فارغة في أي وقت ، لذلك قد ترغب في استخدام العرض ، استطلاع ، أساليب نظرة خاطفة. تعطي هذه الطرق ببساطة رسالة خطأ عندما لا يمكن إكمال المهمة دون إلقاء استثناء.
ملاحظة: أخطاء الاستطلاع واللقيفة والأخطاء وإرجاع فارغة. لذلك ، من غير القانوني إدخال قيمة فارغة في قائمة الانتظار.
هناك أيضًا متغيرات طريقة العرض والاستطلاع مع مهلة ، على سبيل المثال ، المكالمات التالية:
نجاح منطقي = Q.Offer (x ، 100 ، timeunit.milliseconds) ؛
حاول إدخال عنصر في ذيل قائمة الانتظار في 100 ميلي ثانية. إذا نجحت ، ارجع صحيحًا على الفور ؛ خلاف ذلك ، عندما يتم الوصول إلى المهلة ، ارجع كاذبة. وبالمثل ، اتصل:
رأس الكائن = q.poll (100 ، timeUnit.milliseconds) ؛
إذا تمت إزالة عنصر رأس قائمة الانتظار بنجاح خلال 100 ميلي ثانية ، يتم إرجاع عنصر الرأس على الفور ؛ خلاف ذلك ، يتم إرجاع فارغ عند الوصول إلى المهلة.
أخيرًا ، لدينا عمليات حظر وضعها ونأخذها. يتم كتل طريقة وضع عندما تكون قائمة الانتظار ممتلئة ، وكتل طريقة أخذ عندما تكون قائمة الانتظار فارغة.
توفر حزمة java.ulil.concurrent 4 متغيرات من قوائم انتظار حظر. بشكل افتراضي ، فإن قدرة LinkedBlockingQueue ليست الحد الأعلى (إنها غير دقيقة. السعة هي integer.max_value عند عدم تحديدها. إذا لم يكن الأمر كذلك ، فكيف يمكن حظرها عند وضعها) ، ولكن يمكنك أيضًا اختيار تحديد سعة الحد الأقصى. إنها قائمة انتظار تعتمد على قائمة مرتبطة ، والتي تصف عناصر من FIFO (الأول في البداية).
يحتاج ArrayBlockingqueue إلى تحديد السعة أثناء البناء ، ويمكنك اختيار ما إذا كان الإنصاف مطلوبًا. إذا تم تعيين المعلمة العادلة ، فسيتم معالجة الخيط الذي يحتوي على أطول وقت انتظار أولاً (في الواقع ، يتم تحقيق هذا الإنصاف عن طريق تعيين reentrantlock إلى True: أي أن الخيط مع أطول وقت انتظار سيعمل أولاً). عادة ، يمكن أن يكلفك الإنصاف الأداء ويستخدمه فقط عندما يكون ضروريًا حقًا. إنها قائمة انتظار حلقة حظر قائمة على صفيف تقوم بفرز العناصر وفقًا لمبدأ FIFO (First in First Out).
PriorityBlockingQueue هي قائمة انتظار ذات أولوية ، وليس قائمة انتظار في أول من خارج. تتم إزالة العناصر بترتيب الأولوية ، ولا يوجد في قائمة الانتظار الحد الأعلى (نظرت إلى رمز المصدر. المورد الذي يتم استنفاده) ، ولكن إذا كانت قائمة الانتظار فارغة ، فسيتم حظر عملية أخذ العنصر ، لذلك يتم حظر عملية البحث الخاصة به. بالإضافة إلى ذلك ، يجب أن يكون للعناصر التي تدخل قائمة الانتظار قدرات مقارنة.
أخيرًا ، يعد Develiqueue (الذي تم تنفيذه على أساس الأولوية) قائمة انتظار حظر غير محدودة تتخزن العناصر المتأخرة ، ولا يمكن استخراج العناصر إلا عندما ينتهي التأخير. رأس قائمة الانتظار هذا هو العنصر المتأخر مع أطول وقت تخزين بعد انتهاء التأخير. إذا لم تنتهي أي من التأخيرات ، فلن يكون لدى قائمة الانتظار رؤوسًا وسيعود استطلاع الاستطلاع. عندما تُرجع طريقة getDelay (timeUnit.nanoseconds) لعنصر ما قيمة أقل من أو تساوي الصفر ، يحدث انتهاء الصلاحية ويزيل الاستطلاع العنصر. قائمة الانتظار هذه لا تسمح عناصر فارغة. هنا واجهة التأخير:
كود جافا
تمتد الواجهة العامة المتأخرة المماثلة <ghended> {Long GetDelay (وحدة TimeUnit) ؛ }سيقوم العنصر الذي يضع DelayQueue أيضًا بتنفيذ طريقة المقارنة ، والتي تستخدم هذا لفرز العناصر.
يوضح المثال التالي كيفية استخدام قائمة انتظار الحظر للتحكم في مجموعة مؤشرات الترابط. يبحث البرنامج عن جميع الملفات في دليل واحد وجميع الدلائل الفرعية ، ويطبع قائمة بالملفات التي تحتوي على الكلمات الرئيسية المحددة. كما يتضح من الأمثلة التالية ، فإن الفوائد المهمة لاستخدام قوائم انتظار الحظر هما: التشغيل متعدد الخيوط لقوائم الانتظار الشائعة لا يتطلب التزامن إضافي. بالإضافة إلى ذلك ، ستعمل قائمة الانتظار تلقائيًا على موازنة الحمل ، أي إذا تتم معالجة المعالجة (كلا جانبي الإنتاج والاستهلاك) بسرعة ، فسيتم حظرها ، وبالتالي تقليل فجوة سرعة المعالجة بين الجانبين. ما يلي هو التنفيذ المحدد:
كود جافا
الفئة العامة blockingqueuetest {public static void main (string [] args) {scanner in = new scanner (system.in) ؛ system.out.print ("أدخل الدليل الأساسي (eg /usr/local/jdk5.0/src):") ؛ دليل السلسلة = in.nextLine () ؛ System.out.print ("أدخل الكلمة الرئيسية (مثل التقلب):") ؛ سلسلة Keyword = in.nextLine () ؛ Final int file_queue_size = 10 ؛ // حظر حجم قائمة الانتظار النهائي int search_threads = 100 ؛ // عدد مؤشرات قوائم البحث عن الكلمات الرئيسية // حظر قائمة انتظار الحظر استنادًا إلى ArrayBlockingQueueblockingqueue <file> Queue = new ArrayBlockingQueue <ible> (file_queue_size) ؛ . موضوع جديد (العداد) .start () ؛ . }} class fileEnumerationTask تنفذ Runnable {// يتم وضع كائن metafile الغبي في نهاية قائمة انتظار الحظر للإشارة إلى أن الملف قد تم اجتيازه الملف الثابت العام = ملف جديد ("") ؛ plockingqueue الخاص <file> قائمة انتظار ؛ ملف خاص startDirectory ؛ public FileEnumerationTask (قائمة انتظار blockingqueue <ilecte> ، ملف STARTDIRECTORY) {this.queue = queue ؛ this.startingDirectory = startDirectory ؛ } public void run () {try {enumerate (startDirectory) ؛ queue.put (dummy) ؛ // تنفيذ هنا للإشارة إلى أن الملف في الدليل المحدد قد تم اجتيازه} catch (interruptedException e) {}} // وضع جميع الملفات في الدليل المحدد في قائمة انتظار الحظر ككائنات ملفات عامة التعداد الفراغ العام (دليل الملف) interruptedexception لـ (ملف الملف: الملفات) {if (file.isdirectory ()) red (file) ؛ آخر // ضع العنصر في نهاية قائمة الانتظار. إذا كانت قائمة الانتظار ممتلئة ، فقم بحظر قائمة الانتظار (ملف) ؛ }}} class searchtask تنفذ Runnable {private blockingqueue <ilem> قائمة انتظار ؛ الكلمة الرئيسية الخاصة بالسلسلة الخاصة ؛ SearchTask العام (plockingqueue <iple> قائمة الانتظار ، الكلمة الأساسية السلسلة) {this.queue = Queue ؛ this.keyword = الكلمة الرئيسية ؛ } public void run () {try {boolean done = false ؛ بينما (! تم) {// جلب العنصر الأول من قائمة الانتظار. إذا كانت قائمة الانتظار فارغة ، فقم بملف ملف = queue.take () ؛ if (file == fileEnumerationTask.dummy) {// قم بإحضاره ووضعه بحيث تنتهي مؤشرات الترابط الأخرى بسرعة عند قراءتها Queue.put (file) ؛ تم = صحيح ؛ } Else Search (file) ؛ }} catch (ioException e) {E.PrintStackTrace () ؛ } catch (interruptedException e) {}} يلقي بحث باطل عام (ملف) iOexception {scanner in = new Scanner (FileInputStream (ملف) جديد) ؛ int الكتان = 0 ؛ بينما (in.hasNextLine ()) {Linenumber ++ ؛ خط السلسلة = in.nextLine () ؛ if (line.contains (الكلمة الرئيسية)) system.out.printf ("٪ s: ٪ d: ٪ s ٪ n" ، file.getPath () ، linenumber ، السطر) ؛ } in.close () ؛ }} الرابط الأصلي: http://www.cnblogs.com/end/archive/2012/10/25/2738493.html
ما سبق هو كل محتوى هذه المقالة. آمل أن يكون ذلك مفيدًا لتعلم الجميع وآمل أن يدعم الجميع wulin.com أكثر.