黑马程序员技术交流社区

标题: 交通灯求助 [打印本页]

作者: 张云杰    时间: 2013-7-28 23:52
标题: 交通灯求助
本帖最后由 张云杰 于 2013-7-29 01:51 编辑





   问: run里面是放什么东西???  这里为什么要记录变黑的灯???  求解下 求回答的详细点, 越仔细越好..
作者: 王磊    时间: 2013-7-29 00:00
记录的不是变黑的灯,而是这个关灯方法的返回值,返回的是下一个点亮的灯,不知楼主的blackout方法中的代码是怎么写的,不过按照视频里老师的写法,确实返回的是当前灯关闭以后下一个亮起的灯,并将这个灯置为当前灯。。
作者: 张云杰    时间: 2013-7-29 00:07
王磊 发表于 2013-7-29 00:00
记录的不是变黑的灯,而是这个关灯方法的返回值,返回的是下一个点亮的灯,不知楼主的blackout方法中的代码 ...

我这个就是老师代码

我想知道的是为什么这里记录的是不变黑的灯 而不是下一个灯???  (老师代码返回的是下一个灯)

如果是下一个灯, 那是不是说..

下次10秒 执行的就是还是黑灯了???

是这个意思么?
作者: 王磊    时间: 2013-7-29 00:15
这里当前的灯记录的就是下一个灯啊,而关灯的方法内部是将当前灯关闭,然后将其下一个灯变亮,并返回。这时当前灯记录的就是这个变亮的灯了。然后等待10秒后,再次执行当前灯的关灯操作,并将它返回的下一个点亮的灯作为当前灯。这样进行的循环。
  1.         public Lamp lampOff()
  2.         {
  3.                 //当前灯为灭,对应灯也为灭,并且当前灯的下一个灯为亮
  4.                 this.lighted = false;
  5.                 if(opposite != null)
  6.                 {
  7.                         //这个方法是通过名称来获取枚举类中的对象。静态方法
  8.                         Lamp.valueOf(opposite).lighted = false;
  9.                 }
  10.                
  11.                 //变量要定义在if语句外部,否则无法返回。
  12.                 Lamp nextLamp = null;
  13.                
  14.                 if(next != null)
  15.                 {
  16.                         nextLamp = Lamp.valueOf(next);
  17.                         //调用开灯方法,将下一个灯以及相关的灯变绿
  18.                         nextLamp.lampOn();
  19.                 }
  20.                
  21.                 //返回下一个灯,作为控制器中的当前灯
  22.                 return nextLamp;
  23.         }
复制代码
这个是我写的关灯方法,忘了跟老师写的是否一样,不过道理应该是一样的。
作者: 张云杰    时间: 2013-7-29 00:20
本帖最后由 张云杰 于 2013-7-29 00:23 编辑
王磊 发表于 2013-7-29 00:15
这里当前的灯记录的就是下一个灯啊,而关灯的方法内部是将当前灯关闭,然后将其下一个灯变亮,并返回。这时 ...

代码跟老师的一样 不用看了.. 我想知道 这样做的目的何在???

没答到点上啊 哥哥..  我是想知道 内部已经返回了 nextLamp

那么 在这里  为什么它还需要记录起来呢???

也就是为什么 要currentlamp = currentLamp.blackOut();

是为了每次都是关闭灯而存在?????

这才是我的问题啊

按照老师所说.. 如果内部返回的是nextlamp 并且将他亮起来..

那么 这里是不是说 每次做都是将当前灯关闭, 下个灯亮起, 则currentLamp.blackOut();此内部已经这样做了..

为什么需要currentlamp 来记录这个currentLamp.blackOut();






作者: 王磊    时间: 2013-7-29 00:27
线程是一个循环,如果不将这个变亮的灯记录下来,那么下次currentLamp.blackOut()的时候,你让它执行什么?currentLamp这个变量不就应该指向一个亮着的灯,才能让它调用关灯的方法么。
作者: 张云杰    时间: 2013-7-29 00:29
王磊 发表于 2013-7-29 00:27
线程是一个循环,如果不将这个变亮的灯记录下来,那么下次currentLamp.blackOut()的时候,你让它执行什么? ...

按这么说的话 .. 这里应该要被 synchronized 所修饰了
作者: 张云杰    时间: 2013-7-29 00:29
表示说不过去
作者: 王磊    时间: 2013-7-29 00:35
张云杰 发表于 2013-7-29 00:29
按这么说的话 .. 这里应该要被 synchronized 所修饰了

同步?操作共有数据了么?
作者: 张云杰    时间: 2013-7-29 00:35
王磊 发表于 2013-7-29 00:27
线程是一个循环,如果不将这个变亮的灯记录下来,那么下次currentLamp.blackOut()的时候,你让它执行什么? ...

如果不让 它赋值给currentlamp 会出现什么情况
作者: 王磊    时间: 2013-7-29 00:40
张云杰 发表于 2013-7-29 00:35
如果不让 它赋值给currentlamp 会出现什么情况

会一直执行第一次初始化的两条路线的灯为true因为currentlamp的值一直没有变

作者: 张云杰    时间: 2013-7-29 00:45
本帖最后由 张云杰 于 2013-7-29 00:46 编辑
王磊 发表于 2013-7-29 00:35
同步?操作共有数据了么?

按照你说的
线程是一个循环,如果不将这个变亮的灯记录下来,那么下次currentLamp.blackOut()的时候,你让它执行什么?
如果不用synchronized 那么, 是不是说多个线程一起来控制, 岂不是乱了套????
那么 是不是说 这个灯只能被一个线程控制, 下次线程过来需要等待了, 等线程抢到了 接着执行,
  如果是黑灯, 下次执行还是黑灯.. 老师视频里有说.. (交通灯第10个视频 06分15秒)


作者: 张云杰    时间: 2013-7-29 00:47
王磊 发表于 2013-7-29 00:40
会一直执行第一次初始化的两条路线的灯为true因为currentlamp的值一直没有变
...

哥们 加QQ 语音给我讲解下吧..
作者: 王磊    时间: 2013-7-29 00:51
LampController这个类你可以把它理解成一个路口,这个路口的所有灯都用一个控制器来延迟控制,也就是讲所有灯按照一个顺序去控制。
我说的是一个路口只有一个控制器。也就是说,只要多一个路口,就多了一个控制器,你说A路口的控制器能去操作B路口的灯么。我只是举这么个例子,现实生活中可以一条马路的所有路口都由一个控制器控制呢。

也就是说控制器只操作灯的顺次变化,你认为还有哪个线程操作了灯的变化?
作者: 王磊    时间: 2013-7-29 00:53
张云杰 发表于 2013-7-29 00:47
哥们 加QQ 语音给我讲解下吧..

195737328   加下我吧
作者: 张云杰    时间: 2013-7-29 00:57
本帖最后由 张云杰 于 2013-7-29 00:58 编辑
王磊 发表于 2013-7-29 00:51
LampController这个类你可以把它理解成一个路口,这个路口的所有灯都用一个控制器来延迟控制,也就是讲所有 ...

不不不, 这个思路我是明白的.. 我不解的是 为什么 要用一个新的当前灯??

而且 为什么会一直执行第一次初始化的两条路线的灯为true因为currentlamp的值一直没有变

内部已经不是将next 的灯点亮了么, 然后当前的关了.. 那岂不是矛盾了??? 内部不是将currentlamp 变了吗?

  那到底这里需要怎么一个解释???

  也就是说 为什么 需要将下一个灯点亮后 赋值给当前灯 这样问, 不赋值为什么不行?
  
  因为内部已经在操作了改变..那么此时 当前灯就已经指向了下一个灯了.. 为什么还要赋值给当前灯

  问题比较绕口.. 我所有的代码都看懂了 唯独这步不懂...

  哥们给点力 求解... 晚上搞定完这个问题 明天入学申请




作者: 王磊    时间: 2013-7-29 01:45
张云杰 发表于 2013-7-29 00:57
不不不, 这个思路我是明白的.. 我不解的是 为什么 要用一个新的当前灯??

而且 为什么会一直执行第一次 ...

就这么愉快的解决了。。。加油吧!!黑马见:D
作者: 张云杰    时间: 2013-7-29 01:51
王磊 发表于 2013-7-29 01:45
就这么愉快的解决了。。。加油吧!!黑马见

O拉 wish me luck




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