次のようにコードをコピーします。
パブリック クラス TestCyclicBarrier {
プライベート静的最終整数 THREAD_NUM = 5;
public static class WorkerThread は Runnable{ を実装します
CyclicBarrier バリア;
public WorkerThread(CyclicBarrier b){
this.barrier = b;
}
@オーバーライド
public void run() {
// TODO 自動生成されたメソッド スタブ
試す{
System.out.println("作業者が待機しています");
//すべてのスレッドがバリアに到達するまで、スレッドはここで待機します。
バリア.await();
System.out.println("ID:"+Thread.currentThread().getId()+"動作中");
}catch(例外 e){
e.printStackTrace();
}
}
}
/**
* @param 引数
*/
public static void main(String[] args) {
// TODO 自動生成されたメソッド スタブ
CyclicBarrier cb = new CyclicBarrier(THREAD_NUM, new Runnable() {
//すべてのスレッドがバリアに到達すると実行されます
@オーバーライド
public void run() {
// TODO 自動生成されたメソッド スタブ
System.out.println("内側のバリア");
}
});
for(int i=0;i<THREAD_NUM;i++){
新しいスレッド(新しいワーカースレッド(cb)).start();
}
}
}
/*
出力は次のとおりです。
労働者が待っています
労働者が待っています
労働者が待っています
労働者が待っています
労働者が待っています
インサイドバリア
ID:12 ワーキング
ID:8 ワーキング
ID:11 ワーキング
ID:9 ワーキング
ID:10 ワーキング
*/
1. CyclicBarrier の初期化時に数値を指定し、CyclicBarrier.await()を呼び出して待機するスレッドの数を計算します。スレッド数がこの数に達すると、待機状態になっていたすべてのスレッドが起動されて続行されます。
2. CyclicBarrier は、その名前が示すように、この障害物を一緒に通過する前に、すべてのスレッドが存在している必要があります。
3. CyclicBarrier は、最初に Runnable パラメーターを受け取ることもできます。この Runnable タスクは、CyclicBarrier の数に達した後、他のすべてのスレッドが起動される前に実行されます。