Java分布式应用学习笔记05多线程下的并发同步器----后篇(二)

2014-11-24 02:03:55 · 作者: · 浏览: 1
System.out.println("所有玩家进入第二关!");

}

});

for (int i = 0; i < 4; i++) {

new Thread(new Player(i, cyclicBarrier)).start();

}

}

}

class Player implements Runnable {

/**

* 线程之间需要交互,到一定的条件下,所有线程才能往下走

*/

private CyclicBarrier cyclicBarrier;

private int id;

public Player(int id, CyclicBarrier cyclicBarrier) {

this.cyclicBarrier = cyclicBarrier;

this.id = id;

}

@Override

public void run() {

try {

System.out.println("玩家" + id + "正在玩第一关...");

cyclicBarrier.await();

System.out.println("玩家" + id + "进入第二关...");

} catch (InterruptedException e) {

e.printStackTrace();

} catch (BrokenBarrierException e) {

e.printStackTrace();

}

}

}

使用cyclicBarrier.await();方法进行等待、阻塞,当所有分线程执行完毕了,主线程开始执行,分线程的自由也解脱了,继续往下走,开始第二关。

7. Exchanger

Exchanger是线程资源交换器,线程A与线程B在某个运行阶段需要互换资源才能完成任务。这就好比2个公司职员——叶小钗和一页书。分别在不同的项目组——组A和组B,两个组开发者不同的项目,在正常时候叶小钗在组A上班开发者BOSS项目,一页书在项目组B开发ESB中间件产品。而在特殊时期项目组B不需要一页书了,需要叶小钗提供技术支持,就和项目组A要叶小钗,项目组A的leader也不是吃素的,你要叶小钗,没问题,把一页书也得接我们项目组剥削几天!就这样项目组B与项目组A做了这种“交易”(交换),用完了之后,恩~看程序吧

Java代码

package threadConcurrent.test;

import java.util.concurrent.Exchanger;

/**

* 资源交换

* @author liuyan

*/

public class ExgrDemo {

public static void main(String args[]) {

//交换器

Exchanger exgr = new Exchanger();

new TeamB(exgr);

new TeamA(exgr);

}

}

/**

* 项目组A

* @author liuyan

*/

class TeamA implements Runnable {

Exchanger ex;

String str;

TeamA(Exchanger c) {

ex = c;

str = new String();

new Thread(this).start();

}

public void run() {

char ch = 'A';

for (int i = 0; i < 3; i++) {

for (int j = 0; j < 5; j++)

str += (char) ch++;

try {

str = ex.exchange(str);

} catch (InterruptedException exc) {

System.out.println(exc);

}

}

}

}

/**

* 项目组B

* @author liuyan

*/

class TeamB implements Runnable {

Exchanger ex;

String str;

TeamB(Exchanger c) {

ex = c;

new Thread(this).start();

}

public void run() {

for (int i = 0; i < 3; i++) {

try {

str = ex.exchange(new String());

System.out.println("Got: " + str);

} catch (InterruptedException exc) {

System.out.println(exc);

}

}

}

}

需要说明的就是这种交换一定是成对儿的,就是交换的线程数目一定是偶数。否则奇数个线程,剩下那一个和谁交换去?这也是“等价交易”的一种体现。

8. 总结

这次主要介绍了并发环境下常常使用的并发包,用于控制多线程的并发调度、同步、交互、交换、协作等等。使用这些协作同步器,可以更灵活的处理线程之间的关系。也能更好地使用硬件资源为我们的并发系统提供高效率的运行能力。当然这次总结仅仅限于使用的层次,底层的实现源码分析有时间再做总结。