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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wangpan 中级黑马   /  2013-6-15 16:09  /  2031 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 孙百鑫 于 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)+"开走了!");在这一句中,程序是怎么知道要删除的是哪个方向的第一辆车呢?
希望高手帮忙来解释一下~

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

7 个回复

倒序浏览
每一个Road实例对象负责一个方向上车辆的产生和消亡,  总共有12个Road对象, 这些Road的名字就是方向的名字 ,如“N2W” ,名字为“N2W”的Road实例对象,就“N2W”方向上的车辆的产生的消亡

评分

参与人数 1技术分 +1 收起 理由
袁梦希 + 1 很给力!

查看全部评分

回复 使用道具 举报
刘海陆 发表于 2013-6-15 17:15
每一个Road实例对象负责一个方向上车辆的产生和消亡,  总共有12个Road对象, 这些Road的名字就是方向的名 ...

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

我的意思是比如说,看vehicles.remove(0)这条语句,在减少车辆的时候,只是这样remove(0),程序怎么知道是remove哪个vehicles呢?是不是在Road实例对象生成的时候,这些信息就会保存到线程里?等到那个线程执行的时候,就会知道remove的是哪个vehicles?
回复 使用道具 举报
vechiclles 是实例对象的,在对内存空间中 ,总共有12Road对象, 每个Road对象都有一个与之映射的线程,在操纵vechicles
回复 使用道具 举报
Road对象生成的时候,就会开启一个线程,用来 移走车辆的  ,至于你说的信息存储在线程中,我认为信息不能存储在线程中,线程就是一段执行路径,它能操作Road对象中的内容。
回复 使用道具 举报
刘海陆 发表于 2013-6-15 19:58
Road对象生成的时候,就会开启一个线程,用来 移走车辆的  ,至于你说的信息存储在线程中,我认为信息不能 ...

不好意思,脑子里还是有点模糊。呵呵。是不是这样的?
比如S2N这个Road对象,它在生成的时候,就会开启两个线程,有一个线程负责往S2N这条路增加车辆,还有一个线程负责减少S2N这条路的车辆。这两个线程就专门只负责S2N这条路。无论CPU把时间片给其他哪个线程,等轮到这两个线程执行的时候,它操作的就只是S2N这个对象。
回复 使用道具 举报
x.love 中级黑马 2013-6-17 10:20:51
8#
这个应该是随机的,只要某条路上有车,且要走的方向上的灯是绿灯,则会移除一辆车。不考虑具体那辆车。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马