Java5當中添加了障礙器,爲了適應一種新的設計需求,比如說一個大型任務,有很多的子任務,只有當子任務都完成了,才能執行主任務,這個時候就需要障礙器。
障礙器是多線程併發控制的一種有效的手段。
示例如下:
public class Thread_CyclicBarrier {
public static void main(String args[]){
//創建障礙器,並創建一個主任務MainTask_CyclicBarrier
CyclicBarrier cyclicBarrier=new CyclicBarrier(6,new MainTask_CyclicBarrier());
//創建7個子任務
new SubTask_CyclicBarrier("A",cyclicBarrier).start();
new SubTask_CyclicBarrier("B",cyclicBarrier).start();
new SubTask_CyclicBarrier("C",cyclicBarrier).start();
new SubTask_CyclicBarrier("D",cyclicBarrier).start();
new SubTask_CyclicBarrier("E",cyclicBarrier).start();
new SubTask_CyclicBarrier("F",cyclicBarrier).start();
}
}
/**
* 主任務
*/
class MainTask_CyclicBarrier implements Runnable{
@Override
public void run() {
System.out.println(">>>>>>主任務執行了<<<<<<<<");
}
}
/**
* 子任務
*/
class SubTask_CyclicBarrier extends Thread{
private String name;//名稱
private CyclicBarrier cyclicBarrier;//障礙器
SubTask_CyclicBarrier(String name,CyclicBarrier cyclicBarrier){
this.name=name;
this.cyclicBarrier=cyclicBarrier;
}
@Override
public void run() {
System.out.println("子任務"+name+"開始執行");
for (int i=0;i<100;i++)
System.out.println("子任務"+name+"執行完成了,並通知障礙器已經完成");
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
運行結果如下:
從結果可以看出,只有當所有的子任務完成以後,才能執行主任務,從而達到了控制的目標。