CountDownLatch 使用(模拟一场比赛)

java.util.concurrency中的CountDownLatch,主要用于等待一个或多个其他线程完成任务。CountDownLatch在初始化时,会被赋一个整数,每次执行countDown()方法,该整数都会减一,直至到0,这一过程不可逆转。其await()方法会在该整数不为0时当前线程阻塞,为0时当前线程进行下去。阻塞时,其他线程得到执行。

下面是一个普通的案例:

Player
import java.util.Random;
import java.util.concurrent.CountDownLatch;

public class Player implements Runnable {

	private CountDownLatch begin;
	private CountDownLatch end;
	private String playerNO;

	public Player(String playerNO, CountDownLatch begin, CountDownLatch end) {
		this.playerNO = playerNO;
		this.begin = begin;
		this.end = end;
	}

	@Override
	public void run() {
		// 等待枪响
		try {
			begin.await();
			long timeUsed = new Random().nextInt(10000);
			Thread.sleep(timeUsed);
			System.out.println("运动员" + playerNO + "耗时" + timeUsed + "完成比赛");
		} catch (InterruptedException e) {
			e.printStackTrace();
		} finally {
			end.countDown();
		}

	}

}

  

OlympicsGame
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class OlympicsGame {
	private static final int PLAYER_SIZE = 5;
	private CountDownLatch begin;
	private CountDownLatch end;

	public CountDownLatch getBegin() {
		return begin;
	}

	public void setBegin(CountDownLatch begin) {
		this.begin = begin;
	}

	public CountDownLatch getEnd() {
		return end;
	}

	public void setEnd(CountDownLatch end) {
		this.end = end;
	}

	public OlympicsGame() {
		begin = new CountDownLatch(1);
		end = new CountDownLatch(PLAYER_SIZE);
	}

	public static void main(String[] args) {
		// 举办一场比赛
		OlympicsGame olympic = new OlympicsGame();
		// 设定比赛开始,枪声
		CountDownLatch begin = olympic.getBegin();
		// 所有运动员结束比赛,才算结束比赛
		CountDownLatch end = olympic.getEnd();
		// 运动员进场,并编号,等待枪响
		Player[] players = new Player[PLAYER_SIZE];
		ExecutorService ex = Executors.newFixedThreadPool(PLAYER_SIZE);

		for (int i = 0; i < 5; i++) {
			players[i] = new Player("NO" + (i + 1), begin, end);
			ex.submit(players[i]);
		}
		// 枪响
		begin.countDown();

		try {
			// 等待所有运动员到达终点
			end.await();
			System.out.println("比赛结束,所有运动员完成比赛");
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

}

某次执行结果是:

时间: 2024-10-26 03:29:55

CountDownLatch 使用(模拟一场比赛)的相关文章

最近打的三场比赛的总结

10.25 上午 省常中模拟赛 比赛题目刚发下来,看到出题人之后我就变得紧张起来,因为暑假的时候也做过一份他出的题,题目难到连全场最高分也不过 100 多分,所以又一次做到他出的题难免有些心理阴影. 这种心态直接导致了我在第一题上的失误.由于在心里认为这场模拟赛的难度应该较高,导致我对于第一题几乎不假思索就认为是动规,而根本没有往更简单的方向去想.我一开始想到的是区间动规,但是发现只能拿 50 分,想了一会儿还是没什么思路,于是先把区间动规打好然后打第二题. 第二题是一道比较不错的题,但是由于强

我的第一场比赛——金马五校赛

这场比赛在东华大学举办,基于我上次普及组初赛没有过(本人过于蒟蒻),这算是我的第一场正式线下比赛. 我们学校信息组总共有九个人报名参加,我是其中第八名,但是在整场比赛中大约五五开. 以下是我的比赛心得: 这次比赛是在是发挥失常了.热身赛的时候排名还不错,三十几名,但是到了正式比赛就不行了.这场考试共十二道题目只做出2道. 第一题应该是很水的,但是我少考虑了一个条件,查了将近两个小时后才发现错误. 第二道和最后一道题目都可以用暴力做,但是也不知道为什么就是不让我过. 第六道题目是做的最快的题目,用

Python之模拟职场人生游戏

题目:模拟人生 要求:1.至少有两个角色 2.玩的过程中,有冲突 3.根据不同的交互,产生不同的行为. 4.一定要用到面向对象语法和思想 1.解题思路 创建一个类,赋予角色不同的方法,使用面向对象思想实现 2.流程图 3.源码实现 #!/usr/bin/env python # -*- coding:utf-8 -*- # Version:Python3.5.0 # At 2016/3/3 9:38 import sys import time class Person(object): ass

acm的第一场比赛的总结

6.4-6.5号很激动的去湖南湘潭打了一场邀请赛,这是第一次acm的旅程吧.毕竟大一上册刚开始接触c,然后现在就能抱着学长的大腿(拖着学长的后腿)打比赛,也是有一点小小的激动. 第一天很早就起床了,由于周五的时候敢色彩构成的作业敢到凌晨两点,然后周五早上8点起床然后在晨光收作业到十点,最后兴冲冲的走到办公室结果老师人不在,然后拖着三大袋的作业打电话给老师,然后等了一个小时,于是周六早上出奇的累.然后再高铁上睡了5个小时(虽然愣是没睡着),然后就到湘潭大学签到,最后打了一场挂0的热身赛(1小时),

一场比赛

今天考了一场让我差点爆0的比赛,似乎最初只有10分.其中一题数据有误,修正过后也只是多了60分. 改得很辛苦啊! A:

最近两场比赛 CF 285 &amp; TC 646

Codeforces 285 这场rating又掉了,好在只掉了十多. 题目比较水,但是我比赛时居然只艰辛地过了前两道. 504A 由于图是森林,所以一定有度为1的点,把这些点删了后图还是森林.然后就完了.比赛的时候居然把森林当成了树,交了3次才过. 504B 把排列表示为一个n元组\( (p_0, p_1, \cdots, p_{n - 1})\),其中\(0 \leqslant p_i \leqslant i \),其排名为 \[\sum_{i = 0}^{n - 1}{p_ii!}\].

NOIP模拟赛 篮球比赛1

篮球比赛1(basketball1.*) Czhou为了提高机房里各种神牛的身体素质,决定在每次训练后举行篮球比赛.为了保持比赛公平,Czhou要将神牛们分成两队.首先神牛们赛前都要排成固定的队伍:然后Czhou将队伍分成一半(前一半和后一半队伍人数可以不等),再分别从两个队伍中选出一些人进行篮球比赛.为了保持公平性,Czhou要求第一个队伍参加比赛的神牛能力的XOR值等于第二个队伍参加比赛的神牛能力的and值.为了增加比赛趣味,每次比赛的参加神牛们不能一样,Czhou现在想知道可以举办多少天的

模拟职场人生

题目:模拟人生 要求:1.至少有两个角色 2.玩的过程中,有冲突 3.根据不同的交互,产生不同的行为. 4.一定要用到面向对象语法和思想 构造思路: 主题是定义一个从小青梅竹马的情侣在职场上的人生经历 首先找到共同的特点有金钱.名字.姓名.性别.角色,然后对这些共同的点构造一个类,首先定义一个方法谈话内容是否生气,显示不同的字体颜色,其次定义一个方法是金钱的加与减 其次定义入职函数.选择函数.分手函数.继续好下去函数 最后去创建对象并进行实例化 构造流程图 构造原码如下: #!/usr/bin/

打了22场比赛的卢比奥场均可以得到10.3分8.8个助攻1.7个

http://www.juexiang.com/detail/60952833287.htmlhttp://www.juexiang.com/detail/60952833363.htmlhttp://www.juexiang.com/detail/60952833408.htmlhttp://www.juexiang.com/detail/60952833457.htmlhttp://www.juexiang.com/detail/60952833529.htmlhttp://www.juex