コードコピーは次のとおりです。
パッケージcom.yao;
java.util.randomをインポートします。
java.util.concurrent.cyclicbarrierをインポートします。
/**
* CyclicbarrierはCountDownLatchに似ており、カウンターでもあります。
*違いは、cyclicbarrierの数がcyclicbarrier.await()と呼ばれ、待機数を入力することです。
*スレッドの数がCyclicbarrierの初期時間に指定された数に達すると、待機状態に入るすべてのスレッドが目覚めて継続します。
* Cyclicbarrierは、その名前と同様に、障害と見なすことができます。
*この障害を一緒に渡すことができる前に、すべてのスレッドを到着する必要があります。
* Cyclicbarrierは、最初は実行可能なパラメーターを持つこともできます。
*環状バリアの数が到達した後、他のすべてのスレッドは目覚める前に実行されます。
*/
パブリッククラスのcyclicbarriertest {
public static class componentthreadは実行可能{
Cyclicbarrierバリア; //カウンター
int id; //コンポーネントID
int [] array; //データアレイ
//構築方法
public componentThread(cyclicbarrier Barrier、int [] array、int id){
this.barrier = barrier;
this.id = id;
this.array = array;
}
public void run(){
試す {
array [id] = new Random()。nextint(100);
system.out.println( "component" + id + "生成:" + array [id]);
//ここで障壁を待ちます
System.out.println( "component" + id + "sleep ...");
Barrier.await();
system.out.println( "component" + id + "目覚め...");
//データアレイ内の電流と後続の値を計算します
int result = array [id] + array [id + 1];
System.out.println( "component" + id + "result:" + result);
} catch(例外Ex){
}
}
}
/**
* Cyclicbarrierの使用をテストします
*/
public static void testcyclicbarrier(){
final int [] array = new int [3];
Cyclicbarrier Barrier = new Cyclicbarrier(2、new runnable(){
//すべてのスレッドがバリアに到着したら実行します
public void run(){
system.out.println( "testcyclicbarrier run ...");
array [2] = array [0] + array [1];
}
});
//スレッドを起動します
新しいスレッド(new ComponentThread(Barrier、Array、0))。start();
新しいスレッド(new ComponentThread(Barrier、Array、1))。start();
}
public static void main(string [] args){
cyclicbarriertest.testcyclicbarrier();
}
}