การคัดลอกรหัสมีดังนี้:
แพ็คเกจ com.yo;
นำเข้า java.util.random;
นำเข้า java.util.concurrent.cyclicbarrier;
-
* Cyclicbarrier นั้นคล้ายกับ Countdownlatch และยังเป็นตัวนับ
* ความแตกต่างคือจำนวน cyclicbarrier เรียกว่า cyclicbarrier.await () เพื่อป้อนหมายเลขรอ
* เมื่อจำนวนเธรดมาถึงจำนวนที่ระบุในเวลาเริ่มต้นของ cyclicbarrier เธรดทั้งหมดที่เข้าสู่สถานะรอจะถูกปลุกและดำเนินการต่อ
* Cyclicbarrier เช่นเดียวกับชื่อของมันถือได้ว่าเป็นอุปสรรค
* กระทู้ทั้งหมดจะต้องมาถึงก่อนที่พวกเขาจะผ่านอุปสรรคนี้ด้วยกัน
* CyclicBarrier ยังสามารถมีพารามิเตอร์ที่เรียกใช้ได้ในตอนต้น
* หลังจากจำนวน cyclicbarrier ถึงเธรดอื่น ๆ ทั้งหมดจะถูกดำเนินการก่อนที่จะถูกปลุก
-
Public Class CyclicBarrierTest {
Public Static Class ComponentThread ใช้งาน Runnable {
Cyclicbarrier Barrier; // เคาน์เตอร์
ID int; // ส่วนประกอบ ID
int [] array; // data array
// วิธีการสร้าง
public componentThread (cyclicbarrier barrier, int [] array, int id) {
this.barrier = อุปสรรค;
this.id = id;
this.array = Array;
-
โมฆะสาธารณะเรียกใช้ () {
พยายาม {
อาร์เรย์ [id] = new random (). nextint (100);
System.out.println ("ส่วนประกอบ" + id + "สร้าง:" + อาร์เรย์ [id]);
// รอสิ่งกีดขวางที่นี่
System.out.println ("ส่วนประกอบ" + id + "นอนหลับ ... ");
Barrier.await ();
System.out.println ("Component" + ID + "Awakened ... ");
// คำนวณค่าปัจจุบันและค่าที่ตามมาในอาร์เรย์ข้อมูล
int result = array [id] + array [id + 1];
System.out.println ("ส่วนประกอบ" + id + "ผลลัพธ์:" + ผลลัพธ์);
} catch (exception ex) {
-
-
-
-
* ทดสอบการใช้งาน CyclicBarrier
-
Public Static Void TestCyclicBarrier () {
int สุดท้าย [] array = new int [3];
CyclicBarrier Barrier = New CyclicBarrier (2, ใหม่ Runnable () {
// ดำเนินการเมื่อเธรดทั้งหมดมาถึงสิ่งกีดขวาง
โมฆะสาธารณะเรียกใช้ () {
System.out.println ("TestCyclicBarrier Run ... ");
อาร์เรย์ [2] = อาร์เรย์ [0] + อาร์เรย์ [1];
-
-
// เริ่มเธรด
เธรดใหม่ (ComponentThread ใหม่ (สิ่งกีดขวาง, อาร์เรย์, 0)). start ();
เธรดใหม่ (ComponentThread ใหม่ (สิ่งกีดขวาง, อาร์เรย์, 1)). start ();
-
โมฆะคงที่สาธารณะหลัก (สตริง [] args) {
CyclicBarrierTest.TestCyclicBarrier ();
-
-