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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 马亚冲 黑马帝   /  2011-8-13 07:47  /  2420 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

[code=java]package com.isoftstone.interview.traffic;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
* 每个Road对象代表一条路线,总共有12条路线,即系统中总共要产生12个Road实例对象。
* 每条路线上随机增加新的车辆,增加到一个集合中保存。
* 每条路线每隔一秒都会检查控制本路线的灯是否为绿,是则将本路线保存车的集合中的第一辆车移除,即表示车穿过了路口。
* @author 张孝祥 www.it315.org
*
*/
public class Road {
        private List<String> vechicles = new ArrayList<String>();
       
        private String name =null;
        public Road(String name){
                this.name = name;
               
                //模拟车辆不断随机上路的过程               
                ExecutorService pool = Executors.newSingleThreadExecutor();
                pool.execute(new Runnable(){
                        public void run(){
                                for(int i=1;i<1000;i++){
                                        try {
                                                Thread.sleep((new Random().nextInt(10) + 1) * 1000);
                                        } catch (InterruptedException e) {
                                                e.printStackTrace();
                                        }
                                        vechicles.add(Road.this.name + "_" + i);
                                }                               
                        }
                       
                });
               
                //每隔一秒检查对应的灯是否为绿,是则放行一辆车               
                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 !");
                                                        }
                                                }
                                               
                                        }
                                },
                                1,
                                1,
                                TimeUnit.SECONDS);
               
        }
}[/code]这里面的这里的用法我不太清楚:[code=java]boolean lighted = Lamp.valueOf(Road.this.name).isLighted();[/code]这里对name的操作Road.this.name和这里直接 写name而这里修改为[code=java]public Road(final String name){[/code]效果一样,怎么解释,这两种方法的分别的含义是什么??
[ 本帖最后由 马亚冲 于 2011-08-13  07:48 编辑 ]

评分

参与人数 1技术分 +1 收起 理由
wangfayin + 1 有问题就会有收获!

查看全部评分

3 个回复

倒序浏览
黑马网友  发表于 2011-8-13 14:09:16
沙发
如果有两个name,一个外部类的,一个内部类的。在内部类就是用这方法来获得你外部类的name
回复 使用道具 举报
黑马网友  发表于 2011-8-13 23:11:15
藤椅

回复 沙发 的帖子

这个name不是作为参数传递过来了吗??

这个内部类,应用包含了它的这个函数的参数,不是很自然的事吗,怎么又成了获得外部类的name了??

虽然这个name在外部类也有,但是在这个函数里面它是作为参数了啊????
回复 使用道具 举报
黑马网友  发表于 2011-8-13 23:53:45
板凳
手机没看到代码,我说的是没有传递引用那种情况。就上面那份代码而言,我想应该可以直接用name表示(手机看不到代码,猜测)我想他这样写的原因应该告诉你还可以这么用。比如我们在构造函数中经常用this.name=name,原因是name重名了。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马