انسخ رمز الكود كما يلي:
الطبقة العامة TestCyclicBarrier {
نهائي ثابت خاص THREAD_NUM = 5؛
فئة ثابتة عامة WorkerThread تنفذ Runnable{
حاجز CyclicBarrier؛
عامل عام عام (CyclicBarrier ب) {
this.barrier = b;
}
@تجاوز
تشغيل الفراغ العام () {
// TODO طريقة تم إنشاؤها تلقائيًا stub
يحاول{
System.out.println("انتظار العامل");
// تنتظر الخيوط هنا حتى تصل جميع الخيوط إلى الحاجز.
AWAIT();
System.out.println("المعرف:"+Thread.currentThread().getId()+" العمل");
}قبض(استثناء ه){
printStackTrace();
}
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO طريقة تم إنشاؤها تلقائيًا stub
CyclicBarrier cb = new CyclicBarrier(THREAD_NUM, new Runnable() {
// يتم تنفيذه عندما تصل جميع سلاسل الرسائل إلى الحاجز
@تجاوز
تشغيل الفراغ العام () {
// TODO طريقة تم إنشاؤها تلقائيًا stub
System.out.println("الحاجز الداخلي");
}
});
for(int i=0;i<THREAD_NUM;i++){
موضوع جديد(new WorkerThread(cb)).start();
}
}
}
/*
هنا هو الإخراج:
انتظار العامل
انتظار العامل
انتظار العامل
انتظار العامل
انتظار العامل
داخل الحاجز
المعرف: 12 العمل
المعرف: 8 العمل
المعرف: 11 العمل
المعرف: 9 العمل
المعرف: 10 العمل
*/
1. حدد رقمًا عند تهيئة CyclicBarrier، ثم احسب عدد سلاسل العمليات التي تستدعي CyclicBarrier.await() للانتظار. عندما يصل عدد المواضيع إلى هذا العدد، يتم تنشيط جميع المواضيع التي دخلت حالة الانتظار وتستمر.
2. CyclicBarrier، كما يوحي اسمه، يمكن اعتباره عائقًا، ويجب أن تكون جميع الخيوط موجودة قبل أن تتمكن من تجاوز هذه العقبة معًا.
3. يمكن لـ CyclicBarrier أيضًا أن يأخذ معلمة Runnable في البداية، وسيتم تنفيذ هذه المهمة القابلة للتشغيل بعد الوصول إلى عدد CyclicBarriers وقبل تنشيط جميع سلاسل العمليات الأخرى.