黑马程序员技术交流社区

标题: 有关张老师讲的交通灯管理系统的问题 [打印本页]

作者: wangpan    时间: 2013-6-15 16:09
标题: 有关张老师讲的交通灯管理系统的问题
本帖最后由 孙百鑫 于 2013-6-19 09:06 编辑
  1. public class Road {
  2. //每个Road对象都有一个name成员变量来代表方向,有一个vehicles成员变量来代表方向上的车辆集合
  3. private List<String> vehicles = new ArrayList<String>();
  4. private String name = null;

  5. public Road(String name){
  6. this.name = name;
  7. //jdk1.5的线程库Executors
  8. ExecutorService pool = Executors.newSingleThreadExecutor();
  9. //在Road对象的构造方法中启动一个线程每隔一个随机的时间向vehicles集合中增加一辆车
  10. //Runalbe是接口不能直接new,所以这里new了个接口实现类的对象
  11. pool.execute(new Runnable(){
  12. public void run() {
  13. for(int i= 1;i<1000;i++){
  14. try {
  15. //产生1-10之间的随机整数
  16. Thread.sleep((new Random().nextInt(10)+1)*1000);
  17. System.out.println(Road.this.name+"线程到底是个什么东西");
  18. } catch (InterruptedException e) {
  19. e.printStackTrace();
  20. }
  21. //内部类想要访问外部类的局部变量,外部类的局部变量要加上final修饰
  22. //这里也可以访问外部类的成员变量来实现
  23. //访问外部类的成员变量本来可以直接写外部类的成员变量名,
  24. //但是如果这个变量与自己类里的变量名冲突了,要加上类名.this.变量名
  25. vehicles.add(Road.this.name + "_" + i);
  26. System.out.println("牌照为"+Road.this.name + "_" + i + "的车来了");
  27. }

  28. }

  29. });

  30. //在Road对象的构造方法中启动一个定时器,每隔一秒检查该方向上的灯是否为绿,是则将集合中的第一辆车移除掉
  31. ScheduledExecutorService timer = Executors.newScheduledThreadPool(1);
  32. timer.scheduleAtFixedRate(
  33. new Runnable(){

  34. public void run() {
  35. if(vehicles.size() > 0){
  36. boolean lighted = Lamp.valueOf(Road.this.name).isLighted();
  37. //布尔型的变量直接用,不用和true去比较了lighted==true
  38. if(lighted){
  39. System.out.println(vehicles.remove(0)+"开走了!");
  40. }
  41. }
  42. }

  43. },
  44. 1,
  45. 1,
  46. TimeUnit.SECONDS);

  47. }
  48. }
复制代码
在这个Road类里,有两个线程,第一个线程是用来随机向路上增加车辆的,
第二个线程是一个定时器,判断是否为绿灯,隔一秒就开走一辆车。
有一点不明白,在定时器中,
System.out.println(vehicles.remove(0)+"开走了!");在这一句中,程序是怎么知道要删除的是哪个方向的第一辆车呢?
希望高手帮忙来解释一下~


作者: 刘海陆    时间: 2013-6-15 17:15
每一个Road实例对象负责一个方向上车辆的产生和消亡,  总共有12个Road对象, 这些Road的名字就是方向的名字 ,如“N2W” ,名字为“N2W”的Road实例对象,就“N2W”方向上的车辆的产生的消亡
作者: wangpan    时间: 2013-6-15 17:56
刘海陆 发表于 2013-6-15 17:15
每一个Road实例对象负责一个方向上车辆的产生和消亡,  总共有12个Road对象, 这些Road的名字就是方向的名 ...

是不是每生成一个Road实例对象,就会有一个不同的vehicles成员变量么?这些vehicles在内存不同的地方?
同时,就会生成2个线程,一个负责增加车辆,一个负责减少车辆?然后这两个线程就不停的执行呢?
作者: wangpan    时间: 2013-6-15 18:02
刘海陆 发表于 2013-6-15 17:15
每一个Road实例对象负责一个方向上车辆的产生和消亡,  总共有12个Road对象, 这些Road的名字就是方向的名 ...

我的意思是比如说,看vehicles.remove(0)这条语句,在减少车辆的时候,只是这样remove(0),程序怎么知道是remove哪个vehicles呢?是不是在Road实例对象生成的时候,这些信息就会保存到线程里?等到那个线程执行的时候,就会知道remove的是哪个vehicles?

作者: 刘海陆    时间: 2013-6-15 19:56
vechiclles 是实例对象的,在对内存空间中 ,总共有12Road对象, 每个Road对象都有一个与之映射的线程,在操纵vechicles
作者: 刘海陆    时间: 2013-6-15 19:58
Road对象生成的时候,就会开启一个线程,用来 移走车辆的  ,至于你说的信息存储在线程中,我认为信息不能存储在线程中,线程就是一段执行路径,它能操作Road对象中的内容。
作者: wangpan    时间: 2013-6-16 09:20
刘海陆 发表于 2013-6-15 19:58
Road对象生成的时候,就会开启一个线程,用来 移走车辆的  ,至于你说的信息存储在线程中,我认为信息不能 ...

不好意思,脑子里还是有点模糊。呵呵。是不是这样的?
比如S2N这个Road对象,它在生成的时候,就会开启两个线程,有一个线程负责往S2N这条路增加车辆,还有一个线程负责减少S2N这条路的车辆。这两个线程就专门只负责S2N这条路。无论CPU把时间片给其他哪个线程,等轮到这两个线程执行的时候,它操作的就只是S2N这个对象。
作者: x.love    时间: 2013-6-17 10:20
这个应该是随机的,只要某条路上有车,且要走的方向上的灯是绿灯,则会移除一辆车。不考虑具体那辆车。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2