تنفيذ ذاكرة التخزين المؤقت للبرمجة المتزامنة Java
1. فئة قاعدة ذاكرة التخزين المؤقت المحددة
Package Cn.XF.CP.Ch14 ؛/** * الوظيفة: ذاكرة التخزين المؤقت المقيدة تنفيذ الفئة الأساسية * الوقت: 2:20:00 PM * الملف: BaseBoundedBuffer.java * @Adpults Administrator * * param <v> */public class baseboundBuffeR <v> {private final v [] buf ؛ ذيل الباحث الخاص رئيس int الخاص عدد int الخاص passboundedBuffer (السعة int) {// تهيئة الصفيف this.buf = (v []) كائن جديد [السعة] ؛ } // وضعت في البيانات ، لا يمكن إعادة كتابة الطريقة النهائية المحمية المحمية الفراغ النهائي المتزامن (V) {buf [tail] = v ؛ if (++ tail == buf.length) {tail = 0 ؛ } // أدخل طريقة ، إجمالي المبلغ ++ ++ عدد ؛ } / *** خذ بيانات* @RETURN* / محمية متزامنة VIT DOTAKE () {v v = buf [head] ؛ buf [head] = null ؛ if (++ head == buf.length) {head = 0 ؛ } --عدد؛ العودة v ؛ } // عن طريق الحكم على العد ، حدد ما إذا كانت الصفيف ممتلئًا بولاءًا نهائيًا متزامنًا عامًا متزامنًا isfull () {return count == buf.length ؛ } isempty النهائي المتزامن العام () {return count == 0 ؛ }}2. تحديد المتطلبات المسبقة قبل إجراء العملية
Package cn.xf.cp.ch14 ؛/*** الوظيفة: تحقق من الإدراج والحصول على عمليات العناصر أولاً ، ثم قم بإجراء العملية. لا يمر التحقق ولن يُسمح له بتشغيل * الوقت: 2:33:41 PM * الملف: GrumpyBoundedBuffer.java * @Adpults Administrator * * @Param <v> */public class grumpyboundedbuffer <v> extendes baseboundedbuffer <v> {public grumpyboundboundboundbuffer) } PUD VOID المتزامن العام (V) يلقي استثناء {// إذا كان قائمة انتظار كاملة ، لا يمكن إدراج العنصر الجديد إذا (this.isfull ()) {رمي استثناء جديد ("Qule يتجاوز") ؛ } this.doput (v) ؛ } // بالمثل ، إذا كانت قائمة الانتظار فارغة ، فلا يمكن استرداد العنصر الجديد المزامنة العامة v take () استثناء {if (this.isempty ()) {رمي استثناء جديد ("لا يوجد عنصر في قائمة الانتظار") ؛ } إرجاع this.dotake () ؛ }}3. تحقيق حجب بسيط من خلال الاقتراع والنوم
حزمة cn.xf.cp.ch14 ؛/** *الوظيفة: تنفيذ الحجب البسيط من خلال الاقتراع والإسبات *الوقت: 2:55:54 PM *الملف: sleepyboundedbuffer.java * @مؤلف المسؤول * @param <v> */public classybufferbuffer <v> تمديد baseboundbuffer <v> 2000 ؛ SleepyBoundedBuffer العامة (السعة int) {super (سعة) ؛ } // عند وضع رميات قائمة الانتظار في قائمة الانتظار (V V) ، قم بإلقاء القفل {بينما (صحيح) {// لا يتم قفل الحلقة هنا ، وإلا فلن يتم إصدار القفل. إذا لم يكن السبات مغلقًا ، فسيتم قفل النوم ، ولا يمكن للآخرين تشغيله أثناء السبات. من المستحيل على عنصر الخروج متزامن (هذا) {// إذا لم تكن قائمة الانتظار ممتلئة ، فضع العنصر إذا (! this.isfull ()) {this.doput (v) ؛ يعود؛ }} // خلاف ذلك ، النوم والخروج من وحدة المعالجة المركزية لاحتلال thread.sleep (sleep_granularity) ؛ }} public v take () رميات interruptedException {بينما (صحيح) {// لا يتم قفل الحلقة هنا ، وإلا فلن يتم إصدار القفل. إذا لم يكن النوم مغلقًا ، يتم قفل النوم ، ولا يمكن للآخرين تشغيله عند النوم. لن تكون هناك عناصر جديدة أبدًا في متزامنة (هذا) {// إذا كان جزء الصفيف فارغًا ، فيمكن استرداد البيانات إذا (! this.isempty ()) {return this.dotake () ؛ } // إذا كانت قائمة الانتظار فارغة ، فحاول النوم لبضع ثوان مرة أخرى} thread.sleep (sleep_granularity) ؛ }}}4. قائمة الانتظار الشرطية
Package cn.xf.cp.ch14 ؛/** * الوظيفة: استخدم قائمة انتظار الشرط * الوقت: 3:32:04 PM * الملف: portedbuffer.java * @Adpults Administrator * * @param <v> */public class boundbuffer <v> يمتد baseBoundBuffer <v> {publicbuffer (publicbuffer). } /** * وضع عناصر البيانات * param v * throws interruptedException * /public pumper pump pum (v) interruptedException {بينما (this.isfull ()) {// تعليق البرنامج هنا وسيتم إصدار القفل this.wait () ؛ } // إذا لم يكن قائمة الانتظار ممتلئة ، فسيتم إيقاظ البرنامج وسيتم استعادة القفل هذا. // ينتهي التنفيذ ويستيقظ في قوائم الانتظار الأخرى this.notifyall () ؛ } synchronized v synchronized v () رميات interruptedException {بينما (this.isempty ()) {this.wait () ؛ } v v = this.dotake () ؛ this.notifyall () ؛ العودة v ؛ }}شكرا لك على القراءة ، آمل أن تساعدك. شكرا لك على دعمك لهذا الموقع!