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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张云杰 高级黑马   /  2013-7-28 23:52  /  2031 人查看  /  17 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 张云杰 于 2013-7-29 01:51 编辑





   问: run里面是放什么东西???  这里为什么要记录变黑的灯???  求解下 求回答的详细点, 越仔细越好..

17 个回复

倒序浏览
记录的不是变黑的灯,而是这个关灯方法的返回值,返回的是下一个点亮的灯,不知楼主的blackout方法中的代码是怎么写的,不过按照视频里老师的写法,确实返回的是当前灯关闭以后下一个亮起的灯,并将这个灯置为当前灯。。
回复 使用道具 举报
王磊 发表于 2013-7-29 00:00
记录的不是变黑的灯,而是这个关灯方法的返回值,返回的是下一个点亮的灯,不知楼主的blackout方法中的代码 ...

我这个就是老师代码

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

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

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

是这个意思么?
回复 使用道具 举报
这里当前的灯记录的就是下一个灯啊,而关灯的方法内部是将当前灯关闭,然后将其下一个灯变亮,并返回。这时当前灯记录的就是这个变亮的灯了。然后等待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.         }
复制代码
这个是我写的关灯方法,忘了跟老师写的是否一样,不过道理应该是一样的。

评分

参与人数 1技术分 +2 收起 理由
杨兴庭 + 2 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 张云杰 于 2013-7-29 00:23 编辑
王磊 发表于 2013-7-29 00:15
这里当前的灯记录的就是下一个灯啊,而关灯的方法内部是将当前灯关闭,然后将其下一个灯变亮,并返回。这时 ...

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

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

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

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

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

这才是我的问题啊

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

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

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





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

按这么说的话 .. 这里应该要被 synchronized 所修饰了
回复 使用道具 举报
表示说不过去
回复 使用道具 举报
王磊 高级黑马 2013-7-29 00:35:23
9#
张云杰 发表于 2013-7-29 00:29
按这么说的话 .. 这里应该要被 synchronized 所修饰了

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

如果不让 它赋值给currentlamp 会出现什么情况
回复 使用道具 举报
张云杰 发表于 2013-7-29 00:35
如果不让 它赋值给currentlamp 会出现什么情况

会一直执行第一次初始化的两条路线的灯为true因为currentlamp的值一直没有变
回复 使用道具 举报
本帖最后由 张云杰 于 2013-7-29 00:46 编辑
王磊 发表于 2013-7-29 00:35
同步?操作共有数据了么?

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

回复 使用道具 举报
王磊 发表于 2013-7-29 00:40
会一直执行第一次初始化的两条路线的灯为true因为currentlamp的值一直没有变
...

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

也就是说控制器只操作灯的顺次变化,你认为还有哪个线程操作了灯的变化?
回复 使用道具 举报
张云杰 发表于 2013-7-29 00:47
哥们 加QQ 语音给我讲解下吧..

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

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

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

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

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

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

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

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



回复 使用道具 举报
张云杰 发表于 2013-7-29 00:57
不不不, 这个思路我是明白的.. 我不解的是 为什么 要用一个新的当前灯??

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

就这么愉快的解决了。。。加油吧!!黑马见:D
回复 使用道具 举报
王磊 发表于 2013-7-29 01:45
就这么愉快的解决了。。。加油吧!!黑马见

O拉 wish me luck
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马