CyclicBarrierをしてたCountDownLatchは、パッケージjava.util.concurrentの下に配置されています
A、たCountDownLatchの使用状況
たCountDownLatchクラスにはコンストラクタだけを提供しています。
パブリックたCountDownLatch(int型のカウント数){} ; // カウントパラメータのカウント値がされ
、その後、次の3つの方法が最も重要なクラスたCountDownLatchのメソッドです。
公共ボイドのawait()は例外:InterruptedExceptionを{スロー }; //スレッドのawait()メソッドが中断される呼び出し、それが継続実行の前にゼロのカウント値まで待機
パブリックブールのawait(長いタイムアウトが、TimeUnitでのユニット)InterruptedExceptionある{}をスロー。 //とのawait()カウント値が0になった後、次にそれが進行しない、一定時間待機する以外は、同様である
)(公共ボイドカウントダウン{}; // カウント値つによって
AたCountDownLatch、同期補助、操作のセットは1つ以上のスレッドが待機することを可能にする、他のスレッドで実行されるまで。
下面举个例子说明:
パッケージmain.java.CountDownLatch。
輸入java.util.concurrent.CountDownLatch;
/ **
* PROJECT_NAME:ダウンロード
*著者:lucaifang
*日:2016年3月18日
* /
publicクラスcountDownlatchTest {
公共の静的な無効メイン(文字列[]引数)はInterruptedExceptionある{スロー
たCountDownLatchたCountDownLatch =新しいたCountDownLatch(5)。
{(; I <5 I ++ iが0 = INT)のための
新しいスレッド(新しいreadNum(I、たCountDownLatch)))(始めます。
}
countDownLatch.await()。
System.out.println( "线程执行结束....")。
}
静的クラスreadNum実装のRunnable {
プライベートint型のID。
たCountDownLatch LATCHプライベート、
パブリックreadNum(int型のID、たCountDownLatch LATCH){
this.id ID =;
this.latch = LATCH;
}
@Override
公共ボイドRUN(){
同期(本){
するSystem.out.println( "ID:"上記のID +);
latch.countDown();
のSystem.out.println( "スレッドグループタスク" + ID + "端、他のタスクを続行");
}
}
}
}
出力:
上記ID:1つの
スレッドグループタスク1上に、他のタスクを続行
ID:0
、他のタスクを続行スレッドグループタスク0端部を
2:ID
スレッドグループタスク2上に、他のタスクを続行
ID:3
オーバースレッドグループタスク3、他のタスクを継続
ID:4
タスクの終了4スレッドグループが、他のタスクを続行
スレッド実行を終了します。。。。
COUNTDOWN()の後にスレッド、そのタスクを実行していきますが、最終的にすべてのCyclicBarrierをタスクをスレッド化し、具体的な例を下に見ることができ、フォローアップタスクを実行します。
二、CyclicBarrierを使用状況
CyclicBarrierをは、2つのコンストラクタを提供します。
CyclicBarrierを公開(int型のパーティー、RunnableをbarrierAction){
}
公共CyclicBarrierを(int型のパーティー){
}
パラメータの関係者が作るまたはバリア状態に待っているタスクにどのように多くのスレッドを指し;パラメータbarrierAction内容これらのスレッドが達したとき、バリア状態が実行されます。
CyclicBarrierを最も重要な方法は、のawait方法にあります
公共int型のawait()はInterruptedExceptionある、スロー BrokenBarrierExceptionを{}; //は、 すべてのスレッドが後続のタスクを実行しながら、再びバリア状態に到達するまで、現在のスレッドを中断し、
パブリックINTを待つ(ロングタイムアウト、TimeUnitでユニット)InterruptedExceptionある、BrokenBarrierException、TimeoutExceptionを{}スロー; //直接フォローアップタスクを実行するために達する障壁を通すために、バリア状態に到達するためにどのスレッドが存在しない場合、これらのスレッドは、一定の時間まで待機してみましょう
举例说明
main.java.countOffをパッケージ化。
輸入java.util.concurrent.CyclicBarrier;
/ **
* PROJECT_NAME:ダウンロード
*著者:lucaifang
*発売日:2016年3月18日
* /
publicクラスcyclicBarrierTest {
公共の静的な無効メイン(文字列[] args){InterruptedExceptionあるスロー
CyclicBarrierをCyclicBarrierを=新しいCyclicBarrierを(5、新しいRunnableを() {
@Override
公共ボイドラン(){
System.out.printlnは( "线程组执行结束");
}
})。
{(; I <5 I ++ iが0 = INT)のための
新しいスレッド(新しいreadNum(I、CyclicBarrierを)))(始めます。
}
// CyclicBarrierを可以重复利用、
//这个是たCountDownLatch做不到的
//ため(INT iが= 11、I <16; I ++){
//新しいスレッド(新しいreadNum(I、CyclicBarrierを)))(開始。
//}
}
静的クラスreadNum実装のRunnable {
プライベートint型のID。
プライベートCyclicBarrierをするCYC。
公共readNum(int型のID、CyclicBarrierをのCYC){
this.id = ID。
this.cyc = CYC。
}
@Override
公共ボイドラン(){
同期(本){
するSystem.out.println( "ID:" + ID)。
{試みる
cyc.awaitを();
System.out.println( "スレッドグループタスク" + ID + "端、他のタスクを続行");
}キャッチ(例外e){
e.printStackTrace();
}
}
}
}
}
出力:
上記ID上述:1
上記ID上述:2
上記ID上述:4
上記ID上述:0
上記ID上述:3
スレッドグループの端実行する
上スレッドグループタスク3は、他のタスクを続行
スレッドグループタスク1つの上に、他のタスクを続ける
スレッドグループタスク4の終わり、他のタスクを続行
スレッド0端グループタスク、他のタスクを続ける
他のタスクを続行、タスク2を超えるスレッドグループ