A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王月 中级黑马   /  2012-6-25 17:09  /  2306 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王月 于 2012-6-26 16:22 编辑

每隔一秒检查对应的灯是否为绿,是则放行一辆车               
                ScheduledExecutorService timer =  Executors.newScheduledThreadPool(1);
                timer.scheduleAtFixedRate(
                                new Runnable(){
                                        public void run(){
                                                if(vechicles.size()>0){
                                                        boolean lighted = Lamp.valueOf(Road.this.name).isLighted();
                                                        if(lighted){
                                                                System.out.println(vechicles.remove(0) + " is traversing !");//为什么是remove(0)呢,集合的车元素应该不只一个吧
                                                        }
                                                }
                                                
                                        }
                                },
                                1,
                                1,
                                TimeUnit.SECONDS);

7 个回复

倒序浏览
boolean lighted = Lamp.valueOf(Road.this.name).isLighted();
这句代码的意思是,通过枚举中的valueOf方法,把字符串(路对应的名字)变成相应的枚举元素对象,
而后调用枚举中的isLighted方法判断灯是否是绿的,如果是绿的再执行移除第一辆车的操作

System.out.println(vechicles.remove(0) + " is traversing !")
remove(0)表示移除第一辆车,而不是表示集合中只有一辆车

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
许涛 发表于 2012-6-25 18:06
boolean lighted = Lamp.valueOf(Road.this.name).isLighted();
这句代码的意思是,通过枚举中的valueOf方 ...

集合中只有一辆车吗,路上的车一直在产生啊
回复 使用道具 举报
路中定义了对车进行移除和增加的方法,移除和增加是独立的操作,所以定义多线程,你现在写的这个线程是对车进行移除操作的线程
  1. ExecutorService pool = Executors.newSingleThreadExecutor();
  2. pool.execute(new Runnable(){
  3.         public void run(){
  4.                 for (int i=1; i<1000; i++){
  5.                         try {
  6.                                 Thread.sleep((new Random().nextInt(10) + 1) * 1000);
  7.                         } catch (InterruptedException e)
  8.                         {
  9.                                 e.printStackTrace();
  10.                         }
  11.                         vehicles.add(Road.this.name + "_" + i);
  12.                 }
  13.         }
  14. });
复制代码
这个才是随机生成车的线程
回复 使用道具 举报
用一个ArrayList集合来表示这条路中的车,
在实例化一条路时,就会启动一个run方法来增加车,也就是向集合中添加元素。
假设已添加10辆车,红灯变绿。
开始过车,和现实一样,总是第一辆车通过,remove(0),通过后,相当于删除第一辆车,路中还有9辆车。
此时第二辆车变成第一辆车。 接着通过第一辆车 还是remove(0) 此时路中有8辆车。
不管有多少辆车,总是这条路当前的第一辆车通过。也就总是remove(0)了,
先添加进集合的先删除

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 周兴中 于 2012-6-25 18:55 编辑

  ScheduledExecutorService timer =  Executors.newScheduledThreadPool(1);
                timer.scheduleAtFixedRate(
                                new Runnable(){
                                        public void run(){
                                                if(vechicles.size()>0){
                                                        boolean lighted = Lamp.valueOf(Road.this.name).isLighted();
                                                        if(lighted){
                                                                System.out.println(vechicles.remove(0) + " is traversing !");//因为车辆集合由List创建的,根据List的特性,remove(0)表示的就是移除列表中的第一个元素,然后后面的元素向左移动(并且索引减 1),这样每次都移除的就是排队排在前面的车子,你可以想象,交通灯前的车子,肯定是按照顺序,离路口近的车先行驶过路口,然后后面的车子跟上,符合道道路现状.  remove(0)表达的就是这个意思                                                      }
                                                }
                                                
                                        }
                                },
                                1,
                                1,
                                TimeUnit.SECONDS);

评分

参与人数 1技术分 +1 收起 理由
黄奕豪 + 1 赞一个!

查看全部评分

回复 使用道具 举报
王月 中级黑马 2012-6-25 19:30:05
7#
李海晓 发表于 2012-6-25 18:31
用一个ArrayList集合来表示这条路中的车,
在实例化一条路时,就会启动一个run方法来增加车,也就是向集合 ...

嗯,明白了,谢谢
回复 使用道具 举报
王月 中级黑马 2012-6-25 19:30:27
8#
周兴中 发表于 2012-6-25 18:50
ScheduledExecutorService timer =  Executors.newScheduledThreadPool(1);
                timer.sched ...

已经看懂了,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马