Java5中,添加了障碍器类,为了适应一种新的设计需求,比如一个大型的任务,常常需要分配好多子任务去执行,只有当所有子任务都执行完成时候,才能执行主任务,这时候,就可以选择障碍器了。
package barrier;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
public class TestBarrier {
public static void main(String[] args){
new TestBarrier().run();
}
public void run(){
CyclicBarrier cb = new CyclicBarrier(10, new MainTask());
new SubTask("A",cb).start();
new SubTask("B",cb).start();
new SubTask("C",cb).start();
new SubTask("D",cb).start();
new SubTask("E",cb).start();
new SubTask("AA",cb).start();
new SubTask("BB",cb).start();
new SubTask("CC",cb).start();
new SubTask("DD",cb).start();
new SubTask("EE",cb).start();
}
class MainTask implements Runnable{
@Override
public void run() {
System.out.println("主任务开始执行");
}
}
class SubTask extends Thread{
private String name;
private CyclicBarrier cb;
public SubTask(String name, CyclicBarrier cb){
this.name = name;
this.cb = cb;
}
@Override
public void run() {
System.out.println("子任务["+name+"]开始执行。。。");
for(int i=0; i<99999999; i++);
System.out.println("子任务"+name+"执行完成,并通知障碍器");
try {
//wait until all parties invoke await on this barrier
cb.await();
} catch (InterruptedException | BrokenBarrierException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
子任务[A]开始执行。。。
子任务[E]开始执行。。。
子任务[AA]开始执行。。。
子任务[C]开始执行。。。
子任务[B]开始执行。。。
子任务[D]开始执行。。。
子任务C执行完成,并通知障碍器
子任务[CC]开始执行。。。
子任务[BB]开始执行。。。
子任务CC执行完成,并通知障碍器
子任务AA执行完成,并通知障碍器
子任务BB执行完成,并通知障碍器
子任务[DD]开始执行。。。
子任务DD执行完成,并通知障碍器
子任务A执行完成,并通知障碍器
子任务B执行完成,并通知障碍器
子任务D执行完成,并通知障碍器
子任务E执行完成,并通知障碍器
子任务[EE]开始执行。。。
子任务EE执行完成,并通知障碍器
主任务开始执行