问题:一个团队赛跑游戏,最后要计算团队赛跑的成绩,主线程计算最后成绩,要等到所有
import java.util.Random;
import java.util.concurrent.CountDownLatch;
public class CountDownLatchTest2 {
public static void main(String[] args) throws InterruptedException {
CountDownLatch startSignal = new CountDownLatch(1);
CountDownLatch doneSignal = new CountDownLatch(10);
//四个人赛跑,这4个可以写一个for循环
for (int i = 0; i < 10; i++) {
new Thread(new Worker2(startSignal, doneSignal)).start();
}
System.out.println("线程虽然开启,但是startSignal还未到0,以下让start到0");//由于startSignal是1,上边的4个线程还不能执行
startSignal.countDown(); // startSignal=0,线程可以开始执行了
doneSignal.await(); // 判断上边4个是否执行完了,如果是,则允许下边的代码执行
//开始执行另外一个任务
System.out.println("比赛统计...");
}
}
//第一种:等待一个开始信号后,几个线程开始执行
class Worker2 implements Runnable {
private final CountDownLatch startSignal;
private final CountDownLatch doneSignal; //共用的资源
Worker2(CountDownLatch startSignal, CountDownLatch doneSignal) {
this.startSignal = startSignal;
this.doneSignal = doneSignal;
}
@Override
public void run() {
try {
startSignal.await(); //startSignal的计数到0了吗?到0了,才能执行
doWork2();
doneSignal.countDown();
} catch (InterruptedException ex) {
}
}
void doWork2() {
int t=new Random().nextInt(100)+1;
System.out.println(Thread.currentThread().getName()+"选手用时:"+t+"s");
}
}
//结果
线程虽然开启,但是startSignal还未到0,以下让start到0
Thread-0选手用时:36s
Thread-1选手用时:53s
Thread-2选手用时:64s
Thread-3选手用时:87s
Thread-4选手用时:5s
Thread-5选手用时:56s
Thread-6选手用时:63s
Thread-7选手用时:72s
Thread-8选手用时:6s
Thread-9选手用时:94s
比赛统计...
http://blog.csdn.net/zhujiangtaotaise/article/details/60570882