读书人

Java并发编程中CountDownLatch跟Cycli

发布时间: 2013-07-09 09:50:47 作者: rapoo

Java并发编程中CountDownLatch和CyclicBarrier的使用 - [java]
???endSignal.countDown();
???System.out.println("work" + id + "继续干其他事情");
??} catch (InterruptedException e) {
???// TODO Auto-generated catch block
???e.printStackTrace();
??}
?}
}

Main类(终点统计仪器):

import java.util.concurrent.CountDownLatch;

public class Main {
?
?public static void main(String[] args) {
??CountDownLatch begSignal = new CountDownLatch(1);
??CountDownLatch endSignal = new CountDownLatch(8);
??
??for (int i = 0; i < 8; i++) {
???new Thread(new Work(i, begSignal, endSignal)).start();
??}
??
??try {
???begSignal.countDown();? //统一起跑
???endSignal.await();????? //等待运动员到达终点
???System.out.println("结果发送到汇报成绩的系统");
??} catch (InterruptedException e) {
???e.printStackTrace();
??}
?}
}

下面详细描述下CyclicBarrier的应用场景:

有四个游戏玩家玩游戏,游戏有三个关卡,每个关卡必须要所有玩家都到达后才能允许通关。

其实这个场景里的玩家中如果有玩家A先到了关卡1,他必须等待其他所有玩家都到达关卡1时才能通过,也就是说线程之间需要互相等待,这和CountDownLatch的应用场景有区别,CountDownLatch里的线程是到了运行的目标后继续干自己的其他事情,而这里的线程需要等待其他线程后才能继续完成下面的工作。

jdk中CyclicBarrier类有两个常用的构造方法:

1. CyclicBarrier(int parties)

这里的parties也是一个计数器,例如,初始化时parties里的计数是3,于是拥有该CyclicBarrier对象的线程当parties的计数为3时就唤醒,注:这里parties里的计数在运行时当调用CyclicBarrier:await()时,计数就加1,一直加到初始的值

2. CyclicBarrier(int parties, Runnable barrierAction)

这里的parties与上一个构造方法的解释是一样的,这里需要解释的是第二个入参(Runnable barrierAction),这个参数是一个实现Runnable接口的类的对象,也就是说当parties加到初始值时就出发barrierAction的内容。

下面来实现上述的应用场景:

?Player类(玩家类)

import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

public 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();
??}
?}
}

GameBarrier类(关卡类,这里控制玩家必须全部到达第一关结束的关口才能进入第二关)

import java.util.concurrent.CyclicBarrier;

public class GameBarrier {
?
?public static void main(String[] args) {
??CyclicBarrier cyclicBarrier = new CyclicBarrier(4, new Runnable() {
???
???@Override
???public void run() {
????System.out.println("所有玩家进入第二关!");
???}
??});
??
??for (int i = 0; i < 4; i++) {
???new Thread(new Player(i, cyclicBarrier)).start();
??}
?}
}

?

读书人网 >编程

热点推荐