多线程-障碍器

来源:互联网 发布:金融支付 数据挖掘 编辑:程序博客网 时间:2024/04/30 16:56

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{@Overridepublic 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;}@Overridepublic 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 barriercb.await();} catch (InterruptedException | BrokenBarrierException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}
运行结果:

子任务[A]开始执行。。。
子任务[E]开始执行。。。
子任务[AA]开始执行。。。
子任务[C]开始执行。。。
子任务[B]开始执行。。。
子任务[D]开始执行。。。
子任务C执行完成,并通知障碍器
子任务[CC]开始执行。。。
子任务[BB]开始执行。。。
子任务CC执行完成,并通知障碍器
子任务AA执行完成,并通知障碍器
子任务BB执行完成,并通知障碍器
子任务[DD]开始执行。。。
子任务DD执行完成,并通知障碍器
子任务A执行完成,并通知障碍器
子任务B执行完成,并通知障碍器
子任务D执行完成,并通知障碍器
子任务E执行完成,并通知障碍器
子任务[EE]开始执行。。。
子任务EE执行完成,并通知障碍器
主任务开始执行

0 0
原创粉丝点击