نسخة الكود كما يلي:
حزمة com.yao ؛
استيراد java.util.random ؛
استيراد java.util.concurrent.cyclicbarrier ؛
/**
* يشبه Cyclicbarrier CountDownlatch ، وهو أيضًا عداد.
* الاختلاف هو أن عدد Cyclicbarrier يسمى Cyclicbarrier.await () لدخول رقم الانتظار.
* عندما يصل عدد مؤشرات الترابط إلى الرقم المحدد في الوقت الأولي لـ Cyclicbarrier ، يتم إيقاظ جميع المواضيع التي تدخل حالة الانتظار وتستمر.
* يمكن اعتبار Cyclicbarrier ، تمامًا مثل اسمها ، عقبة.
* يجب الوصول إلى جميع المواضيع قبل أن يتمكنوا من اجتياز هذه العقبة معًا.
* يمكن أن يكون Cyclicbarrier معلمة قابلة للتشغيل في البداية.
* بعد عدد وصول Cyclicbarrier ، يتم تنفيذ جميع المواضيع الأخرى قبل إيقاظها.
*/
الطبقة العامة Cyclicbarriertest {
المكونات الفئة الثابتة العامة تنفذ Runnable {
حاجز Cyclicbarrier ؛ // العداد
int id ؛ // معرف المكون
int [] Array ؛ // Array Data
// طريقة البناء
CyclicBarrier Barrier ، int [] Array ، int id) {
this.barrier = حاجز ؛
this.id = id ؛
this.array = صفيف ؛
}
تشغيل الفراغ العام () {
يحاول {
Array [id] = new Random (). nextInt (100) ؛
System.out.println ("Component" + ID + "ينشئ:" + صفيف [id]) ؛
// انتظر الحاجز هنا
System.out.println ("Component" + ID + "Sleep ...") ؛
Barrier.Await () ؛
System.out.println ("Component" + ID + "Awakened ...") ؛
// احسب القيم الحالية واللاحقة في صفيف البيانات
int result = array [id] + array [id + 1] ؛
System.out.println ("Component" + ID + "النتيجة:" + نتيجة) ؛
} catch (استثناء ex) {
}
}
}
/**
* اختبار استخدام Cyclicbarrier
*/
public static void testcyclicbarrier () {
int int [] Array = new int [3] ؛
حاجز Cyclicbarrier = New Cyclicbarrier (2 ، New RunNable () {
// تنفيذ عندما تصل جميع المواضيع إلى الحاجز
تشغيل الفراغ العام () {
System.out.println ("TestCyClicBarrier Run ...") ؛
صفيف [2] = صفيف [0] + صفيف [1] ؛
}
}) ؛
// ابدأ الموضوع
موضوع جديد (مكون جديد (حاجز ، صفيف ، 0)). start () ؛
موضوع جديد (مكون جديد (حاجز ، صفيف ، 1)). start () ؛
}
الفراغ الثابت العام الرئيسي (سلسلة [] args) {
CyclicbarRiertest.testcyclicbarrier () ؛
}
}