您的位置:首页 > 编程语言 > Java开发

11____java线程同步工具类之障碍器(CyclicBarrier)

2014-03-12 22:45 579 查看
CyclicBarrier与Semaphore一样,都是java5的并发库中的。

障碍器(CyclicBarrier)具体实现了什么功能呢?举个例子比如说公司接到一个项目(主线程),一部分人开发前台(线程1),一部分人开发后台(线程2),前台和后台不可能同时开发完成,但是只有前台和后台都开发完成了,才能提交给客户。那么,CyclicBarrier所实现的就是对已完成任务的线程进行阻塞的功能。

例子:

public class CyclicBarrierTest {
public static void main(String[] args) {
CyclicBarrier cb = new CyclicBarrier(2, new Runnable() {
public void run() {
System.out.println("两个项目组都已开发完成,进行测试。");
try {
Thread.sleep((long)Math.random()*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("测试通过,交付给客户");
}
});
new Thread(new Development("前台",cb)).start();
new Thread(new Development("后台", cb)).start();
}
}

class Development implements Runnable{
private String name;
private CyclicBarrier cyclicBarrier;

public Development(String name,CyclicBarrier cyclicBarrier) {
this.name = name;
this.cyclicBarrier = cyclicBarrier;
}

public void run() {
System.out.println(name+"正在开发!");
try {
Thread.sleep((long)Math.random()*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
System.out.println(name+"开发完成");
//通知障碍器已经完成
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
}
运行结果:

前台正在开发!

后台正在开发!

前台开发完成

后台开发完成

两个项目组都已开发完成,进行测试。

测试通过,交付给客户



注意:子线程内所有的运行代码都应该写在通知障碍器之前,否则一旦接到两个线程的完成的通知,指定的运行完成后的程序即开始运行,不再等待子线程.await()方法后的代码。

由此看来,synchroized、Lock、Semaphroe都是对线程运行开始进行控制,而CyclicBarrier是对线程的完成进行控制。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: