声明:文章内容全都是自己的学习总结,如有不对的地方请大家帮忙指出。有需要沟通交流的可加我QQ群:425120333
这里说的其实已经不是怎么实现多线程了,而是关于多线程的应用了;
古时候,行军打仗,总喜欢分兵几路(可能是因为各个兵种行军速度不一样吧,(*^__^*) ),然后在某个指定地点会师,最好在一起的各路大军发起总攻。
这里用多线程怎么实现呢,也许你会说,简单啊,分几路兵,就开几个线程,到指定地点后,就相当于这些线程运行完,然后再开相同的线程数继续执行。
当然上面说的方法是可行的,不过如果知道怎么使用CyclicBarrier这个类的话,其实可以更简单。
public class TestCyclicBarrier implements Runnable {
private String name;//兵种名称
private int speed;//行军速度
private static int waittingPlace = 6;//会师地点和出发地点的距离
private static int allDistance = 8;//要进攻的地点和出发地点的距离
private static CyclicBarrier cyclicBarrier = new CyclicBarrier(3);//假设只有三个兵种
public TestCyclicBarrier(String name, int speed) {
this.name = name;
this.speed = speed;
}
private long getTime() {
return (System.currentTimeMillis() / 1000);
}
@Override
public void run() {
int hasAchieved = 0;
System.out.println(getTime() + "--" + name + "start ");
while (hasAchieved <= allDistance) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
hasAchieved = hasAchieved + speed;
//判断是否到达会师地点
if (hasAchieved == waittingPlace) {
//判断是否是最后一个到达的
if (cyclicBarrier.getNumberWaiting() == cyclicBarrier.getParties() - 1) {
System.out.println(getTime() + "--" + name
+ " is lasted achieved zhe waittingPlace");
} else {
System.out.println(getTime() + "--" + name + " reached at waittingPlace");
}
try {
cyclicBarrier.await();
} catch (Exception e) {
e.printStackTrace();
}
} else {
System.out.println(getTime() + "--" + name + " achieved " + hasAchieved);
}
}
System.out.println(getTime() + "--" + name + " has completed achieved ");
}
public static void main(String[] args) {
ExecutorService service = Executors.newCachedThreadPool();
service.execute(new TestCyclicBarrier("骑兵", 3));
service.execute(new TestCyclicBarrier("步兵", 2));
service.execute(new TestCyclicBarrier("弩车兵", 1));
}
}
控制台显示:
1475657908–步兵start
1475657908–弩车兵start
1475657908–骑兵start
1475657909–骑兵 achieved 3
1475657909–弩车兵 achieved 1
1475657909–步兵 achieved 2
1475657910–弩车兵 achieved 2
1475657910–步兵 achieved 4
1475657910–骑兵 reached at waittingPlace
1475657911–步兵 reached at waittingPlace
1475657911–弩车兵 achieved 3
1475657912–弩车兵 achieved 4
1475657913–弩车兵 achieved 5
1475657914–弩车兵 is lasted achieved zhe waittingPlace
1475657915–步兵 achieved 8
1475657915–骑兵 achieved 9
1475657915–弩车兵 achieved 7
1475657915–骑兵 has completed achieved
1475657916–弩车兵 achieved 8
1475657916–步兵 achieved 10
1475657916–步兵 has completed achieved
1475657917–弩车兵 achieved 9
1475657917–弩车兵 has completed achieved
很明显从控制台中可以看出CyclicBarrier达到了预期的效果,主要是通过cyclicBarrier.await();到达指定地点时让该线程阻塞来完成的,
当所有线程都阻塞时就唤醒全部线程(内部实现了该功能无需我们调用)继续往下执行。