模拟鸟和鱼的生态池塘
来源:互联网 发布:淘宝买监控硬盘靠谱吗 编辑:程序博客网 时间:2024/04/27 04:14
问题来源于:http://topic.csdn.net/u/20120312/12/5ecd2514-362d-4693-ba3e-852d69956434.html
一个池塘,有很多鸟和很多鱼,鸟每分钟产生一个后代,鱼每30秒钟产生2个后代。鸟每10秒钟要吃掉一条鱼。建一个池塘,初始化一些鱼和鸟,看看什么时候鸟把鱼吃光。
本来不算复杂,但是既然写了,就记录下来吧。
import java.util.concurrent.CountDownLatch;public class AboutFishBird { public static void main(String[] args) throws Exception { simulate(24, 5); } private static void simulate(int initFish, int initBird) throws Exception { World world = new World(); world.fishNum = initFish; world.birdNum = initBird; FishKeeper fk = new FishKeeper(world); BirdKeeper bk = new BirdKeeper(world); fk.start(); bk.start(); Thread.sleep(100); // 等待两个线程启动完毕 while (world.fishNum > 0) { synchronized (world) { // 在子线程进入wait()前,世界时间不会开始流逝 world.token = new CountDownLatch(2); world.time += 10; // 世界时间向前流逝 world.notifyAll(); // 通知两个线程可以工作了 } world.token.await(); // 跳动后,等待两个线程完成本次流逝时间的计算过程 System.out.println("[" + world.time + "] fish:" + world.fishNum + ", bird:" + world.birdNum); } System.exit(0); }}/** * 世界环境 */class World { long time; int fishNum; int birdNum; CountDownLatch token;}/** * 鱼群管理器 */class FishKeeper extends Thread { private World world; FishKeeper(World world) { super("FishKeeper"); this.world = world; } public void run() { synchronized (world) { // 防止并发修改冲突 while (world.fishNum > 0) { try { world.wait(); // 等待主线程通知时间已经流逝 } catch (InterruptedException ex) { ex.printStackTrace(); } if (world.time % 30 == 0) { // 每30秒生小鱼 world.fishNum += 2 * world.fishNum; } world.token.countDown(); // 记录工作计算已经完成 } } }}/** * 鸟群管理器 */class BirdKeeper extends Thread { private World world; BirdKeeper(World world) { super("BirdKeeper"); this.world = world; } public void run() { synchronized (world) { // 防止并发修改冲突 while (world.fishNum > 0) { try { world.wait(); // 等待主线程通知时间已经流逝 } catch (InterruptedException ex) { ex.printStackTrace(); } if (world.time % 10 == 0) { world.fishNum -= world.birdNum; // 每10秒吃一次鱼 if (world.time % 60 == 0) { world.birdNum += world.birdNum; // 每60秒生小鸟 } } world.token.countDown(); // 记录工作计算已经完成 } } }}
—— 20131030:因is_zhoufeng提出的死锁缺陷,做出了调整,将同步范围扩大。
- 模拟鸟和鱼的生态池塘
- 鱼与池塘
- 池塘
- 池塘
- 关于开源生态和“闭源”生态的一些想法
- 【2014.8.17NOIP普及组模拟】数池塘
- jzoj 1898. 【2014.8.17NOIP普及组模拟】数池塘
- 假设有一个池塘,里面有无穷多的水。现有2个空水壶,容积分别为5升和7升。问题是如何只用这2个水壶从池塘里取得6升的水?
- 一个池塘里漂浮着一只装有石块的木船,当把石块扔到池塘后,石块下沉,问池塘中的水面高度将如何变化?
- 选对池塘钓大鱼-人生选择的哲理
- 我的产业生态链和杂谈文章
- openstack生态组成和商业运营的挑战
- 免费图标:旅游和生态相关的图标素材
- HTML5是APP生态的血管,传播和渗透!
- 云原生生态,架构和相关的厂商社区介绍
- 自动驾驶的技术架构和生态发展
- 关于原生态和框架之间的相互转换
- 自动驾驶的技术架构和生态发展
- 编程实现两个正整数的除法,当然不能用除法操作符
- ROM RAM FLASH
- 给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数
- 我的见解--小公司不要谈战略
- 1024! 末尾有多少个0?
- 模拟鸟和鱼的生态池塘
- 中间件(EJB)学习路之一——步履维艰
- java list
- 手动 命令行打包 apk 示例(在最下面)
- Spring @Resource
- 3种类型的测试专家之路选择
- java中对象方法初始化顺序
- 第四周任务三
- 07、J2SE基础-Hashtable类